final的用法:不可变类的成员变量类型是可变类的处理方法

不可变类:创建该类实例后,该实例的实例变量是不可改变的。
可变类:该类的实例变量是可变的。

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());
    }
}

输出:
悟空
悟空
悟空

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值