在网上一搜或是查书,得到的结果都是这么写的
protected 的属性和方法可以在本包和子类访问
这里的访问 我不太明白是什么意思。。
一、在不同包中
请看下面两端代码,其中包B中的猫和鼠都继承了动物类。
症结所在:
在不同包中,protected受访问保护规则是很微妙的。虽然protected域对所有子类都可见。但是有一点很重要,子类只能在自己的作用范围内访问自己继承的那个父类protected域,而无法到访问别的子类(同父类的亲兄弟)所继承的protected域。 说白了就是:老鼠只能叫"zhi,zhi"。即使他能看见猫(可以在自己的作用域内创建一个cat对象),也永远无法学会猫叫。
也就是说,cat所继承的crowl方法在cat类作用范围内可见。但在rat类作用范围内不可见,即使rat,cat是亲兄弟也不行。
另外: 这就是为什么我们在用clone方法的时候不能简单的直接将对象aObject.clone()出来的原因了。
总之, 在不同包中, 当B extends A的时候,在子类B的作用范围内,只能调用本子类B定义的对象的protected方法(该方法从父类A中继承而来)。而不能调用其他A类极其子对象的protected 方法
二、在同一个包中,上述代码不会出现编译错误。
结论:
我自己认为,访问分两种(不一定是对的):
一。在类中super关键字去访问它的父类中的方法
二。在类中用某个类的的实例去访问某个类中的方法
第一种访问,只要有继承关系,子类就可以用super去访问父类中定义的protected修饰的方法或属性,不管子类和父类是不是在同一个包中,并且如果类中没有重写父类中的方法和属性的话,用this关键字访问的和用super关键字访问是一样的。
第二种访问,只有在同包的情况下才可以,并且不用考虑继承关系。这个和default修饰符是一样的。
补充 : protected修饰符的成员变量和方法也称为受保护的成员变量和方法, 受保护的成员变量和方法可以在本类或同一个包中的其它类中通过 类的实例进 行访问 , 也可以被同一个包中的类或不同包中的类 继承 ,但是不能在不同包中的其它类中通过 类的实例进行访问 。
一、在不同包中
请看下面两端代码,其中包B中的猫和鼠都继承了动物类。
- //代码1:包A中有一个动物类
- package testa;
- public class Animal {
- protected void crowl(String c){
- System.out.println(c);
- }
- }
- //代码2:包B中有两个类——猫类和鼠类
- package testb;
- import testa.Animal;
- class Cat extends Animal{
- }
- class Rat extends Animal{
- public void crowl(){
- crowl("zhi zhi"); //没有问题,继承了Animal中的protected方法——crowl(String)
- Cat cat=new Cat();
- cat.crowl("miao miao"); //wrong, The method crowl(String) from the type Animal is not visible
- }
- }
症结所在:
在不同包中,protected受访问保护规则是很微妙的。虽然protected域对所有子类都可见。但是有一点很重要,子类只能在自己的作用范围内访问自己继承的那个父类protected域,而无法到访问别的子类(同父类的亲兄弟)所继承的protected域。 说白了就是:老鼠只能叫"zhi,zhi"。即使他能看见猫(可以在自己的作用域内创建一个cat对象),也永远无法学会猫叫。
也就是说,cat所继承的crowl方法在cat类作用范围内可见。但在rat类作用范围内不可见,即使rat,cat是亲兄弟也不行。
另外: 这就是为什么我们在用clone方法的时候不能简单的直接将对象aObject.clone()出来的原因了。
总之, 在不同包中, 当B extends A的时候,在子类B的作用范围内,只能调用本子类B定义的对象的protected方法(该方法从父类A中继承而来)。而不能调用其他A类极其子对象的protected 方法
二、在同一个包中,上述代码不会出现编译错误。
结论:
我自己认为,访问分两种(不一定是对的):
一。在类中super关键字去访问它的父类中的方法
二。在类中用某个类的的实例去访问某个类中的方法
第一种访问,只要有继承关系,子类就可以用super去访问父类中定义的protected修饰的方法或属性,不管子类和父类是不是在同一个包中,并且如果类中没有重写父类中的方法和属性的话,用this关键字访问的和用super关键字访问是一样的。
第二种访问,只有在同包的情况下才可以,并且不用考虑继承关系。这个和default修饰符是一样的。
补充 : protected修饰符的成员变量和方法也称为受保护的成员变量和方法, 受保护的成员变量和方法可以在本类或同一个包中的其它类中通过 类的实例进 行访问 , 也可以被同一个包中的类或不同包中的类 继承 ,但是不能在不同包中的其它类中通过 类的实例进行访问 。