面向对象(下)
final修饰符:
final修饰的成员变量必须由程序员显式地初始值。
final修饰成员变量的各种具体情况:
public class FinalVariableTest { //定义成员变量时指定默认值,合法 final int a = 6; //下面变量将在构造器或初始化块中分配初始值 final String str; final int c; final static double d; //既没有指定默认值,又没有在初始化块、构造器中指定初始值 //下面定义的ch实例变量时不合法的 //final char ch; //初始化块,可对没有指定默认值的实例变量指定初始值 { //在初始化块中为实例变量指定初始值,合法 str = "Hello"; //定义a实例变量时已经指定了默认值 //不能为a重新赋值,因此下面赋值语句非法 //a = 9; } //静态初始化块,可对没有指定默认值的类变量指定初始值 static { //在静态初始化块中为类变量指定初始值,合法 d = 5.6; } //构造器,可对既没有指定默认值,又没有在初始化块中 //指定初始值的实例变量指定初始值 public FinalVariableTest() { //如果在初始化块中已经对str指定了初始值 //那么在构造器中不能对final变量重新赋值,下面赋值语句非法 //str = "java"; c = 5; } public void changFinal() { //普通方法不能为final修饰的成员变量赋值 //d = 1.2; //不能在普通方法中为final成员变量指定初始值 // ch = 'a'; } public static void main(String[] args) { FinalVariableTest ft = new FinalVariableTest(); System.out.println(ft.a); System.out.println(ft.c); System.out.println(ft.d); } }
结果:
注意:系统不会对final成员变量初始化,必须由程序员显示初始化。
final方法:
不可变类:
创建规则
hashCode()和equals()方法的运用:
public class ImmutableStringTest { public static void main(String[] args) { String str1 = new String("Hello"); String str2 = new String("Hello"); System.out.println(str1 == str2); //输出false System.out.println(str1.equals(str2));//输出true //下面两次输出hashCode相同 System.out.println(str1.hashCode()); System.out.println(str2.hashCode()); } }
如果需要设计一个不可变类,尤其要注意,其引用类型的成员变量,如果引用的成员变量的类是可变的,就必须采取必要的措施来保护该成员变量所引用的对象不会被修改,这样才能创建真正的不可变类。
缓存实例的不可变类:
Integer类构造器:valueOf()方法:
Integer只缓存-128~127之间的Integer对象。
抽象类:
abstract修饰符:
定义抽象类只需在普通类上增加abstract修饰符即可。
Shape抽象类:
public abstract class Shape { { System.out.println("执行Shape的初始化块。。。"); } private String color; //定义一个计算周长的抽象方法 public abstract double calPerimeter(); //定义一个返回形状的抽象方法 public abstract String getType(); //定义Shape的构造器并不是用于构建Shape对象 //而且用于被子类调用 public Shape(){} public Shape(String color) { System.out.println("执行Shape的构造器。。。"); this.color = color; } //省略color的setter和getter方法 }