protected访问级别
protected是子类继承和包级访问。对于包外子类,只能通过继承访问protected成员,不能通过使用对超类实例的引用来访问protected成员(换句话说,继承是包外子类访问其超类protected成员的唯一机制)。
对于实例变量和静态变量来说,有一些区别
TestA
package test4; public class TestA { protected static int i = 11; protected int i2=12; }
TestB
package test5; import test4.TestA; public class TestB extends TestA{ public static void main(String[] args) { TestA ta=new TestA(); System.out.println(ta.i);// System.out.println(TestA.i);// System.out.println(TestB.i);// //System.out.println(ta.i2); 这行代码不能被编译* TestB tb=new TestB(); System.out.println(tb.i2); System.out.println(tb.i); new TestA.go(); } public void go() { System.out.println(i); System.out.println(i2); } }
一开始觉得奇怪,因为在TestA里,System.out.println(ta.i);可以被编译,而System.out.println(ta.i2);不能被编译。
事实是,protected并不是父类的方法能在子类中访问,而是父类方法在子类中被继承,所以子类通过继承访问protected方法。
在TestA中,ta.i可以被访问,是因为静态变量i被继承,而静态变量是class级变量,ta.i相当于TestA.i而TestA.i也就相当于TestB.i(TestB继承了此静态变量),这点和对象不一样
而ta.i2,因为i2只能通过子类继承访问,所以从对象ta中无法访问实例变量i2
因为是继承访问,go方法中的两句代码可以被编译