javac与protected

声明:希望大家拍砖,但不要人身攻击

protected:是包和子类可见。但有一个现象很难理解(子类在不同的包中),举个例子。
设计三个类,TObject(基类,其中有个protected void sayHello()方法),TObjectExtends1,TObjectExtends2;
其中TObject和TObjectExtends1在一个包中,TObjectExtends2在另一个包中;
TObjectExtends1和TObjectExtends2继承TObject;然后在TObjectExtends1中运行TObjectExtends2的sayHello()方法。
编译通过,然后运行成功;
然后我在TObjectExtends2中重写了sayHello()方法,权限是protected,然后编译, 编译器报错,试图在TObjectExtends1中调TObjectExtends2中受protected方法;
如果把TObjectExtends2 te2=new TObjectExtends2();改成TObject te2=new TObjectExtends2();改一下声明;又居然可以编译通过了,运行成功;

也就是说在不同包的子类中调用其他子类的protected方法,有可以成功(如果调用的子类没有覆盖父类的protected),也有可能失败,如果都声明成最大的那个超类,那都可以运行了,貌似是编译器的错,

测试代码:
TObject:
package extends1;


public class TObject {
	
	/**
	 * Method TObject
	 *
	 *
	 */
	public TObject() {
		// TODO: Add your code here
	}
	
	protected void sayHello(){
		
		System.out.println("TObject");
		
		}	
}



TObjectExtends1:
package extends1;
import extends2.*;

public class TObjectExtends1 extends TObject {
	
	/**
	 * Method TObjectExtends2
	 *
	 *
	 */
	public TObjectExtends1() {
		// TODO: Add your code here
	}
	public static void main(String[] args){
		
		   TObject te2=new TObjectExtends2();
		   te2.sayHello();
		   // TObjectExtends2 te2=new TObjectExtends2();
		   // te2.sayHello();编译通不过
		   
		
		}	
}


TObjectExtends2:
package extends2;
import extends1.TObject;


public class TObjectExtends2 extends TObject {
	
	/**
	 * Method TObjectExtends1
	 *
	 *
	 */
	public TObjectExtends2() {
		// TODO: Add your code here
	}
	
	@Override

	protected void sayHello(){
		
		System.out.println("TObjectExtends2");
		
		}	
		
		
}






你可能感兴趣的:(protected)