protected关键字:
对于类用户而言这是private的,但对于任何继承于此类的导出类或其他任何位于同一个包内的类来说,他是可以访问的。
final关键字:
(1)final数据
1、final 数据 要么在定义时就初始化 ,要么在每个构造器中初始化,否则编译不过。
2、final修饰基本类型使数值恒定不变;final修饰的对象引用使引用恒定不变,但对象自身是可以被修改的。
(2)final方法
使用final方法原本有两个原因(一)把方法锁定,防止任何继承类修改它(二)出于效率。但现在只需要考虑第一个原因
final vs private
类中所有的private方法都隐式地指定为final的(因为无法取用private方法,也就无法覆盖它)
(3)final类
final类不可以被继承
public class Value { int i; public Value(int i){ this.i = i; } }
import java.util.Random; public class FinalData { private static Random rand = new Random(47); private String id; public FinalData(String id) { this.id = id; } private final int valueOne = 9; private static final int VALUE_TWO = 99; public static final int VALUE_THREE = 39; private final int i4 = rand.nextInt(20); static final int INT_5 = rand.nextInt(20); private Value v1 = new Value(11); private final Value v2 = new Value(22); private static final Value VAL_3 = new Value(33); private final int[] a = { 1, 2, 3, 4, 5, 6 }; public String toString() { return id + ":" + "i4 = " + i4 + ". INT_5 = " + INT_5; } public static void main(String[] args) { FinalData fd1 = new FinalData("fd1"); // !fd1.valueOne++; //Error :The final field FinalData.valueOne cannot // be assigned fd1.v2.i++; fd1.v1 = new Value(9); for (int i = 0; i < fd1.a.length; i++) { fd1.a[i]++; } // !fd1.v2 = new Value(0); //Error :The final field FinalData.valueOne // cannot be assigned // !fd1.VAL_3 = new Value(1);//Error :The final field FinalData.VAL_3 // cannot be assigned - The static field FinalData.VAL_3 should be // accessed in static way // !fd1.a = new int[3]; ////Error :The final field FinalData.valueOne // cannot be assigned System.out.println(fd1); System.out.println("Creating new FinalData"); FinalData fd2 = new FinalData("fd2"); System.out.println(fd1); System.out.println(fd2); } }
输入结果:
fd1:i4 = 15. INT_5 = 18 Creating new FinalData fd1:i4 = 15. INT_5 = 18 fd2:i4 = 13. INT_5 = 18
这里有个疑问:i4和INT_5都是随机数,为何无论运行多少次main方法结果都是一样的?
详见第七章:复用类