访问修饰符&关于超类引用的方法

时间:2015-09-16 18:19:43

标签: java inheritance methods reference access-modifiers

为什么当我在子类中创建超类的引用时,只能从引用中调用public的方法而不是受保护的方法。 (这些类在不同的包中)

package pet;

public class Dog {
    protected void bark(){};
    void jump(){};  
    public void lick(){};
}


package other;
import pet.*;

public class Husky extends Dog {
    public static void main(String[] args){ 
        Husky h = new Husky();
        h.bark();     //COMPILES (Husky is a subclass of Dog - Protected method)
        h.jump();     //DOES NOT COMPILE (Different packages - package-private access method)

        Dog d = new Dog();
        d.bark();   //DOES NOT COMPILE WHY?
        d.jump();   //DOES NOT COMPILE (Different packages - package-private access method)
        d.lick();   //COMPILES (Method is public)
    }
}

我的问题是 d.bark()为什么不编译? bark方法有一个 protected 的访问修饰符,允许从同一个包或子类中的类访问它。那是怎么回事?

如果哈士奇引用能够访问bark方法,则通过相同的逻辑,dog引用也应该能够访问bark方法。

所以我只能假设Dog引用一定存在问题?

1 个答案:

答案 0 :(得分:0)

虽然访问修饰符在继承中起着重要作用,但是这个问题不应该与继承混淆。正如@vikss正确地说Super Class不知道下面的继承树因此我不知道Huskey是否可以访问其受保护的成员。 对于你的问题:

Dog d = new Dog();
    d.bark(); 

在运行时,方法由被引用的基础对象解析。这里的底层对象是Dog超类,我们也可以通过Dog自己访问它。这缩小了从包中访问受保护成员的问题,这是不允许的。

此外,您的代码d.bark();位于main方法中,该方法本身是来自Huskey对象的独立实体。另一个有趣的事实是你甚至无法从Huskey的另一个成员方法调用Dog d = new Dog(); d.bark();这里有访问修饰符),但你可以很好地调用{{1}方法直接在同一个成员方法中(这里有继承)。

希望它有所帮助!