//不可变类举例:
/*
下面程序试图定义一个不可变类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. 【request_firmware】 linux内核下载模块固件接口【转】

    转自:http://blog.csdn.net/magod/article/details/6049558 [-] 8 处理固件 1481 内核固件接口 1482 它如何工作 14.8. 处理固件 作 ...

  2. 移动端网站的内容触摸滑动-Swiper插件

    手机平板等大多移动端站点都会有触摸滑动内容的功能,公司移动端站点(m.muzhiwan.com)的标题广告滑动以及轮播效果就是用的Swiper插件. Swiper就是常用于移动端网站的内容触摸滑动的一 ...

  3. 制作圆角:《CSS3 Border-radius》

    今天我们在一起来看看CSS3中制作圆角的属性border-radius的具体用法.如今CSS3中的border-radius出现后,让我们没有那么多的烦恼了,首先制作圆角图片的时间是省了,而且其还有多 ...

  4. java解析json与map,list相互之间的转换

    运行这个类需要加载jar包:ezmorph-1.0.6.jar.json-lib-2.4-jdk15.jar.jsoup-1.6.1.jar.commons-beanutils-1.8.0.jar.c ...

  5. C++字符串与转移字符

    先看以下代码: #include<iostream> #include<string> using namespace std; int main() { string str ...

  6. 20.fastDFS集群java代码测试

    1.工程结构   2.代码内容 FastdfsClientTest.java代码   package cn.itcast.fastdfs.cliennt; import java.io.File; i ...

  7. Sprint(第五天11.18)

  8. 纯css3圆角下拉菜单 都没敢用js

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. win安装NLTK出现的问题

    一.今天学习Python自然语言处理(NLP processing) 需要安装自然语言工具包NLTK Natural Language Toolkit 按照教程在官网https://pypi.pyth ...

  10. table插件实现

    选择.取消.全选.全部取消.获取行ids /** * Created by lizongqiong on 2016/1/8. */ var $ = require('jquery'); var tab ...