//不可变类举例:
/*
下面程序试图定义一个不可变类Person类,但=因为Person类包含一个引用类型的成员变量,
且这个引用类是可变类,所以导致Person类也变成了可变类。
*/
class Name1
{
private String firstName;
private String lastName;
public Name1(){}
public Name1(String firstName,String lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
public void setFirstName(String firstName){this.firstName = firstName;}
public String getFirstName(){return firstName;}
public void setLastName(String lastName){this.lastName = lastName;}
public String getLastName(){return lastName;}
}
public class Person
{
private final Name1 name;//Person类的引用类型成员变量
public Person(Name1 name)
{
this.name = name;
}
public Name1 getName()
{
return name;
}
public static void main(String[] args)
{
Name1 n = new Name1("悟空","孙");
Person p = new Person(n);
//Person对象的name的firstName值为“悟空”
System.out.println(p.getName().getFirstName());
System.out.println(p.getName().getLastName());
//改变Person对象的name的firstName值为“八戒”
n.setFirstName("八戒");
System.out.println();
//Person对象的name的firstName的值被改为“八戒”
System.out.println(p.getName().getFirstName());
System.out.println(p.getName().getLastName());
}
}
 //不可变类举例:
/*
下面程序试图定义一个不可变类Person类,但=因为Person类包含一个引用类型的成员变量,
且这个引用类是可变类,所以导致Person类也变成了可变类。(这个例子保护了Person对象的
引用类型的成员变量:name,让Person类成为一个真正的不变类)
*/
class Name1
{
private String firstName;
private String lastName;
public Name1(){}
public Name1(String firstName,String lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
public void setFirstName(String firstName){this.firstName = firstName;}
public String getFirstName(){return firstName;}
public void setLastName(String lastName){this.lastName = lastName;}
public String getLastName(){return lastName;}
}
public class Person1
{
private final Name1 name;//Person类的引用类型成员变量
public Person1(Name1 name)
{
//设置name实例变量为临时创建的Name对象,该对象的firstName和LastName
//与传入的name参数的firstName和lastName相同
this.name = new Name1(name.getFirstName(),name.getLastName());
}
public Name1 getName()
{
//返回一个匿名对象,该对象的firstName和lastName
//与该对象的name的firstName和LastName相同.
return new Name1(name.getFirstName(),name.getLastName());
}
public static void main(String[] args)
{
Name1 n = new Name1("悟空","孙");
Person1 p = new Person1(n);
//Person对象的name的firstName值为“悟空”
System.out.println(p.getName().getFirstName());
System.out.println(p.getName().getLastName());
//改变Person对象的name的firstName值为“八戒”
n.setFirstName("八戒");
System.out.println();
//Person对象的name的firstName的值被改为“八戒”
System.out.println(p.getName().getFirstName());
System.out.println(p.getName().getLastName());
}
}
 /*
不可变(immutable)类:的意思是创建该类的失利后,该实例的实例变量是不可改变的。
Java提供的8个包装类和java.lang.String类都是不可变类,当创建它们的实例后,其实例变量不可改变。 */ //测试Java.lang.String类的equals()方法和hashCode方法()
public class ImmutableStringTest
{
public static void main(String[] args)
{
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
//下面两次输出hashCode相等
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
}
}

《Java中的不可变类》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. 论Postgres的“已提交的而且 xmin’比当前事务的XID小的记录对当前事务才是可见的”

    最近在网上看到这样一句话Postgres“已提交的而且 xmin 比当前事务的XID小的记录对当前事务才是可见的”.先不评断这句话的正确性:看下这句话的结构,因果关系: 按照此话的意思:要postgr ...

  2. Oracle简单的函数语言

    函数:这里的函数相当于java中写好的一些方法,有名字,可以传递参数,实现某一项具体功能. 函数分为: 1.单行函数 1.字符函数 2.日期函数 3.数字函数 4.转换函数 2.分组函数(后面的章节再 ...

  3. POI 导出Excel

    package east.mvc.utils; import java.io.*; import java.lang.reflect.*; import java.text.SimpleDateFor ...

  4. 发布网站详细步骤(.Net)

    (i)打开需要发布的网站 右键需要发布的项目 点击下拉框新建配置文件,输入配置文件名称,点击确定,下一步 发布方法选文件系统,目标位置:项目的根目录 配置选Release 点击发布 (ii) 打开ii ...

  5. 《BI那点儿事》三国人物智力分布状态分析

    献给广大的三国爱好者们,希望喜欢三国的朋友一起讨论,加深对传奇三国时代的了解数据分析基础概念:数据分为“不可测量”的数据和“可测量”的数据.不可测量的数据称为“分类数据”(Category Data或 ...

  6. Linux 远程桌面 访问 WIndows

    1. Debain 系列 linux sudo aptitude install rdesktop 2. Connect rdesktop <hostname> -r sound:off ...

  7. zabbix3.0.4 部署之二 (Centos6.5系统准备)

    1.安装Centos6.5  2.6.32-642.4.2.el6.x86_64 升级所有软件至最新: yum update 2.同步时间.安装ntpd yum  install ntpddate n ...

  8. C# 字符串转义和反转义

    System.Text.RegularExpressions.Regex.Unescape(s) System.Text.RegularExpressions.Regex.Escape(s)

  9. .NET WebForm 简介

    WebForm是微软开发的一款产品,它将用户的请求和响应都封装为控件.让开发者认为自己是在操作一个windows界面.极大地提高了开发效率. 在学习WebForm时,其知识量比WinForm要多,在实 ...

  10. java发送 get请求

    package com.java.base; import java.io.BufferedReader; import java.io.InputStreamReader; import java. ...