//不可变类举例:
/*
下面程序试图定义一个不可变类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. T-SQL 的简单查询语句

    通配符: “_”: 代表匹配一个字符 “%”: 代表匹配多个字符: []:表示范围,可以包含多个数据 [^] 表示取反 “-“  表示范围 逻辑与 and 逻辑或 or  逻辑非 not 聚会函数 : ...

  2. ALLOCATE语句分配FORTRAN动态数组方法(转自http://blog.csdn.net/zhuxianjianqi/article/details/8067174)

    数组的动态分配 a)    可分配数组 数组可以是静态的也可以是动态的.如果数组是静态的,则在编译时就被分配了固定的储存空间,并且直到程序退出时才被释放.程序运行时静态数组的大小不能改变.静态数组的缺 ...

  3. arraylist与linkedlist的区别与性能测试

    /** *arraylist和linkedlist的适用场合. **/ import java.util.List; import java.util.ArrayList; import java.u ...

  4. Script 简单语句的练习题

    猜拳 <body>请输入剪刀或者石头或者布:<br /><input type="text" id="A"/><inp ...

  5. python 字符串 转 dict

    比直接eval更好的方法>>>import ast >>>ast.literal_eval("{'muffin' : 'lolz', 'foo' : 'k ...

  6. Java的final关键字

    使用final关键字做标识有“最终的”含义 final可以修饰类.方法.属性和变量: 修饰类,则该类不允许被继承(即不能有子类) 修饰方法,则该方法不允许被覆盖(重写) 修饰属性,则该属性不会进行隐形 ...

  7. CSS边距---盒子模型

    CSS盒子模型 盒子模型主要是有margin(外边距).border(边框).padding(内边距).content(内容)组成,这些属性我们可以把它转移到我们日常生活中的盒子上来理解,日常生活中所 ...

  8. ocLazyLoad angular 按需加载

    ionic 框架 1.引用 index.html 加载 <script type="text/javascript" src="lib/oclazyload/ocL ...

  9. 【转】 CPU大小端

    大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中:小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中. 为什么会有大小端模式之分呢?这是因为 ...

  10. Eclipse中@author的修改

    什么东西都可能会被忘掉,我这种记性不好的就更容易忘了.换了电脑后eclipse中的@author变了,于是找了下修改@author的方法:1. 在eclipse.ini中添加-vmargs-Duser ...