首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >超类引用上的访问修饰符和方法

超类引用上的访问修饰符和方法
EN

Stack Overflow用户
提问于 2015-09-16 18:19:42
回答 1查看 664关注 0票数 4

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

代码语言:javascript
复制
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()不编译?树皮方法有一个受保护的访问修饰符,允许从同一个包或子类中的类访问它。那怎么回事?

如果哈士奇引用能够访问树皮方法,则根据同样的逻辑,狗参考也应该能够访问树皮方法。

所以我只能假设狗的引用一定有问题?

EN

回答 1

Stack Overflow用户

发布于 2015-09-16 20:58:46

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

代码语言:javascript
复制
Dog d = new Dog();
    d.bark(); 

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

d.bark(); 以及您的代码位于main方法中,它本身是一个独立于Huskey对象的实体。另一个有趣的事实是,您甚至不能从Huskey类的另一个成员方法调用bark() bark()(来了访问修饰符),但是您可以在同一个成员方法中直接调用bark()方法(E 123来了inheritance). )。

希望能帮上忙!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32615881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档