最近小咸儿在学习有关Java基础的知识,才发现多次学习下来,每次都能有不同的体会和理解问题的角度。今天特将有关学习final修饰符的内容总结下来。
final修饰符
是什么
final关键字可用于修饰类、变量和方法
- final修饰类:不能被继承
- final修饰变量:初始化赋值后,则不可以改变
- final修饰方法:不能被重写
类
final类
当使用final修饰类时,则表明该类没有子类,即不能被继承
不可变类
不可变类就是说创建该类的实例后,该实例的实例变量就是不可变的
public class Address {
private final String detail;
private final String postCode;
// 构造器中初始化这两个实例变量
public Address()
{
this.detail = "";
this.postCode = "";
}
public Address(String detail, String postCode)
{
this.detail = detail;
this.postCode = postCode;
}
// 仅为两个实例变量提供getter方法
public String getDetail()
{
return this.detail;
}
public String getPostCode()
{
return this.postCode;
}
}
在下面这种情况下,当创建不可变类时,如果它包含成员变量的类型是可变的,那么其对象的成员变量的值依然是可变的。
示例:
class Name
{
private String firstName;
private String lastName;
public Name() {}
public Name(String firstName, String lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
// setter方法
public void setFirstName(String firstName)
{
this.firstName = firstName;
}
public void setLastName(String LastName)
{
this.lastName= lastName;
}
// getter方法
public String getFirstName()
{
return this.firstName;
}
public String getLastName()
{
return this.lastName;
}
}
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 = new Name("悟空", "孙");
Person p = new Person(n);
// Person对象的name的firstName值为“悟空”
System.out.println(p.getName().getFirstName());
// 改变Person对象的name值的firstName值
n.setFirstName("八戒");
// Person对象的name的firstName值被改为“八戒”
System.out.println(p.getName().getFirstName());
}
}