《Java中的不可变类》
//不可变类举例:
/*
下面程序试图定义一个不可变类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中的不可变类》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- Python学习笔记-常用模块
1.python模块 如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失.因此,如果你想要编写一些更大的程序,为准备解释器输入使用一个文本编辑器会更好,并以那个文件替代作 ...
- Android中插件开发篇之----应用换肤原理解析
一.前言 今天又到周末了,感觉时间过的很快呀.又要写blog了.那么今天就来看看应用的换肤原理解析.在之前的一篇博客中我说道了Android中的插件开发篇的基础:类加载器的相关知识.没看过的同学可以转 ...
- 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 ...
- uploadify springMVC
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 怎么修改git提交过的内容
git修改历史提交 Git使用amend选项提供了最后一次commit的反悔.但是对于历史提交呢,就必须使用rebase了. git rebase -i HEAD~3 表示要修改当前版本的倒数第三 ...
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序读取相关数据
这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第七篇:为ASP.NET MVC应用程序 ...
- shell学习笔记1
知识点1.修改输出的颜色 echo -e "\e[1;31m This is red text \e[0m" 其中,\e[1;31m 表示将输出显示为红色: \e[0m 标识将颜色 ...
- PHP的autoload机制的实现解析
在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利 一.autoload机制概述 在使用PHP的OO模式开发系 ...
- centos设置服务开机启动
Linux CentOS设置服务开机启动的方法 by 天涯 · 2013/07/26 CentOS设置服务开机启动的两种方法 1.利用 chkconfig 来配置启动级别 在CentOS或者RedHa ...
- Monkey 使用aapt查看apk包名
使用aapt //aapt是sdk自带的一个工具,在sdk\builds-tools\目录下1.以ES文件浏览器为例,命令行中切换到aapt.exe目录执行:aapt dump badging ...