首页 > Java > protected访问级别

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方法中的两句代码可以被编译

分类: Java 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。