原文:http://blog.csdn.net/linhao19891124/article/details/52971045
当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不能被改变。但对于引用类型的变量而言,它保存的仅仅是一个引用,final只保证这个引用所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以发生改变。
final int[] iArr={6,8,9,10}
//对数组进行排序,合法
Arrays.sort(iArr);
System.out.println(Arrays.toString(iArr));
//对数组元素赋值,合法
iArr[2]=-8;
//下面语句对iArr重新赋值,非法
iArr=null;
注意两种写法:
public class Person
{ private final Name name;
public Person(Name name)
{
this.name=new Name(name.getFirstName(),name.getLastName());
}
public Name getName()
{
return new Name(name.getFirstName(),name.getLastName())
]
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public class Person
{ private final Name name;
public Person(Name name)
{
this.name=name;
}
public Name getName()
{
return name;
]
}
第二种写法:当name内容发生改变时,person也会改变,因为他们公用一个name。
因此如果需要设计一个不可变类,必须注意引用类型的属性,如果引用类型是可变的,必须采用必要的措施保护该属性引用对象不会被修改,这样才能创建真正不可变类。
对于一个private方法,因为它仅在当前类中可见,所以其子类无法访问该方法,就无法重写该方法========如果子类中定义一个与父类private方法有相同方法名,相同形参列表,相同返回值类型的方法,也不是方法重写,只是重新定义了一个新方法。因此
即使用final修饰一个private访问权限的方法,依然可以在其子类中定义与该方法具有相同方法名,相同形参列表,相同返回值类型的方法。
final类
final修饰的类不可有子类,例如java.lang。Math类就是一个final类,它不可以有子类。