protected关键字访问权限

protected 关键字总的作用是这样描述的:它指明“就类用户而言,这时private的,但是对于任何继承于此类的导出类或其他任何位于同一个包内的类来说,它却是可以访问的。” 下面实例代码演示这句话含义。

package inheritate;//放的包名
import static net.mindview.util.Print.*;

class Villain{
	private String name;
	protected void set(String mm){name=mm;}
	public Villain(String name){this.name=name;}
	public String toString(){
		return "I'm a Villain and my name is " +name;
	}
}
public class Orc extends Villain{
	private int orcNumber;
	public Orc(String name,int orcNumber) {
		super(name);
		this.orcNumber=orcNumber;
	}
	public void change(String name,int orcNumber){
		set(name);//调用父类中protected 方法
		this.orcNumber=orcNumber;
	}
	public String toString(){
		return "Orc "+orcNumber+":"+super.toString();
	}
	public static void main(String[] args) {
		Orc orc=new Orc("Limburger", 12);
		print(orc);
		orc.change("Bob", 24);
		print(orc);
	}
}

在一个class文件中,子类能够使用父类中的protected方法,如上set方法。

当两个类在同一个包中:

package a;

public class Father {
    protected int i = 5;            //父类中的protected 域
    protected  void test() {    //父类中的protected方法
    System.out.println("Father's data ="+this.i); 
    }
}


package a;

public class Son extends Father{

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Father f=new Father();
		f.test();
		Son s=new Son();
		s.test();
	}
}
protected 提供包内访问权限,所以 Son类中可以创建Father类并调用test方法。


如果上述两个类不在同一个包内:

package a;

public class Father {
    protected int i = 5;            //父类中的protected 域
    protected  void test() {    //父类中的protected方法
    System.out.println("Father's data ="+this.i); 
    }
}

package b;
import a.Father;
public class Son extends Father{

	public static void main(String[] args) {
		//Father f=new Father();
		//f.test();此处出现错误,就类用户而言是private的
		Son s=new Son();
		s.test();
	}
}

我们看到上面的程序会抛出两个错误,原因就在于:当子类与父类位于不同包中时,父类中的protected成员,对于父类本身是不可访问的,只有子类对象才可以访问!

Son t = new Son(); System.out.println(t.i);   t.test();  不会出错。

在上面的例子上,再做一点修改,把Father 中的test()改为protected static void test() 然后在Son类中创建Father f = new Father();

此时,f 仍然不能访问f.i,但是f却可以访问test(),即用f.test()时,不会出错,原因是:

因为test() 是static Method , static method 调用 不需要通过对象的实例,跟写成 Son.test() 是一样的效果 !


总结:当父类与子类位于同一包中时,不管是子类对象还是父类对象都可以访问protected,但是它们的意义是不一样的;对于子类对象,之所以可以访问是因为:子类从父类继承了protected成员,理所当然可以访问;父类对象(在子类中创建的)之所以可以访问是因为protected提供了包访问极限!


    当父类与子类位于不同包中时,protected成员就只能通过子类对象来访问(因为protected对于子类是可见的),而父类对象不再可以访问!不过,可以访问static 成员(因为protected的包访问极限已失去作用)




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值