概述
不可变类:创建该类实例后,该实例的实例变量是不可改变的。
可变类:该类的实例变量是可变的。
public class Name
{
private String firstName;
private String lastName;
//不带参的构造函数
public Name()
{
}
//带参的构造函数
public Name(String firstName,String lastName)
{
this.firstName=firstName;
this.lastName=lastName;
}
public String getFirstName()
{
return firstName;
}
public void setFirstName(String firstName)
{
this.firstName = firstName;
}
public String getLastName()
{
return lastName;
}
public void setLastName(String lastName)
{
this.lastName = lastName;
}
}
用可变类Name作为成员变量创建不可变类Person,
因为其对象成员变量的值依然可变,这个不可变类是失败的
例:
public class Person
{
//不可变类
private final Name name;
public Person(Name name)
{
this.name=name;
}
public Name getName()
{
return name;
}
public static void main(String[] args)
{
//创建Name的实例变量n
Name n=new Name("悟空","孙");
Person p=new Person(n);
System.out.println(p.name.getFirstName());
//name变量前加了final修饰,name被赋值为n后不可变
//但是n的成员变量并不受此限制
n.setFirstName("猴子");
System.out.println(p.name.getFirstName());
}
}
输出:
悟空
猴子
如何解决这个问题呢?
请看如下程序:
public class Person
{
private final Name name;
public Person(Name name)
{
//name传入来以后,
//用name的两个成员变量再创建一个Name实例
this.name=new Name(name.getFirstName(),name.getLastName());
}
public Name getName()
{
//用成员变量name的两个成员变量,创建一个新的Name变量返回
return new Name(name.getFirstName(),name.getLastName());
}
public static void main(String[] args)
{
Name n=new Name("悟空","孙");
//n做为实参传入
Person p=new Person(n);
System.out.println(p.name.getFirstName());
//n传入后,构造函数用n的成员变量,又重新创建了一个实例
//所以p.name和n之间不再有任何关系
//n的成员变量无论如何修改,都不再影响到p.name
n.setFirstName("猴子");
System.out.println(p.name.getFirstName());
//p.getName()返回的是用p.name的变量成员创建的一个新的Name实例
//因此p.getName()和p.name不是同一个对象
p.getName().setFirstName("猴子");
System.out.println(p.name.getFirstName());
}
}
输出:
悟空
悟空
悟空
最后
以上就是专注水杯为你收集整理的final的用法:不可变类的成员变量类型是可变类的处理方法的全部内容,希望文章能够帮你解决final的用法:不可变类的成员变量类型是可变类的处理方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复