加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 超类引用的访问修饰符和方法[复制]

发布时间:2020-12-15 02:09:43 所属栏目:Java 来源:网络整理
导读:参见英文答案 Understanding java’s protected modifier????????????????????????????????????6个 ???????????? Why can’t I call a protected method from an inheriting class in another package in Java?????????????????????????????????????2个 为什
参见英文答案 > Understanding java’s protected modifier????????????????????????????????????6个
>???????????? Why can’t I call a protected method from an inheriting class in another package in Java?????????????????????????????????????2个
为什么当我在子类中创建超类的引用时,只能从引用中调用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引用一定存在问题?

解决方法

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

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

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

还有你的代码d.bark();在主方法中,它本身是一个来自Huskey的Object的独立实体.另一个有趣的事实是你甚至不能称之为Dog d = new Dog(); d.bark();来自Huskey类的另一个成员方法(这里是访问修饰符),但你可以直接在同一个成员方法中调用bark()方法(这里是继承).

希望能帮助到你!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读