《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 安装并启动 ...
随机推荐
- xcode 创建项目 勾选 git 出现警告
1. 解决方法: 在mac机上找到终端工具 >> 这里先介绍下使用Command-line. 1,下载Git installer,地址:http://git-scm.com/downlo ...
- Date类型,Boolean类型,Number类型
1.Date类型: 1)创建Date对象: var date=new Date(); //Date对象会把当前日期和时间保存为其初始值 2)Date对象的方法: --这些得到的都是数字 ...
- JS闭包导致循环给按钮添加事件时总是执行最后一个
加入如下脚本代码: <script> var list_obj = document.getElementsByTagName('li'); for (var i = 0; i <= ...
- Unity在编辑器状态下清空控制台信息
public static void ClearConsole() { var assembly = System.Reflection.Assembly.GetAssembly(typeof(Uni ...
- 原创开源项目HierarchyViewer for iOS 2.1 Beta新功能介绍
回顾 HierarchyViewer for iOS是我们发布的一个开源项目,采用GPL v3.0协议. HierarchyViewer for iOS可以帮助iOS应用的开发和测试人员,在没有源代码 ...
- ArrayList代码示例
package com.shushine.framework.第七章Java标准类库;import java.util.ArrayList;/** * * <p> * 描述该类情况 {@l ...
- 简单方法判断JavaScript对象为null或者属性为空
对已声明但未初始化的和未声明的变量执行typeof,都返回undefined,null表示一个空对象指针,typeof操作会返回object 首先说下null与undefined区别: 对已声明但未初 ...
- linux 双网卡实现
linux实现双网卡,在虚拟机中创建一个新网卡,NAT方式连接,其中eth0设置为连接外网,目前eth0为自动分配状态,所以将代码注释掉了,eth1设置为连接内网.
- 学习c++
慢慢的滑向无边无际的没有回头路的程序猿道路.坚持就是胜利. 致渣渣
- 忙了好一阵,今天随便写篇关于canvas的小东西
前几天在朋友圈发了几条3D demo视频,其中就有3D空间组成各种图形.如上! 那么这些图形的每个mesh的坐标可不是手动去写,如果你愿意我当然不拦着!所以今天这篇就来介绍如何获得这些图形的坐标数据. ...