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()方法(这里是继承). 希望能帮助到你! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |