Java 访问修改器&;超类的引用上的方法

Java 访问修改器&;超类的引用上的方法,java,inheritance,methods,reference,access-modifiers,Java,Inheritance,Methods,Reference,Access Modifiers,为什么当我在子类中创建超类的引用时,只能从引用中调用公共的方法,而不能调用受保护的方法。(这些类位于不同的包中) 我的问题是为什么d.bark()不编译?bark方法有一个访问修饰符protected,它允许从同一个包或子类中的类访问它。发生了什么事 如果husky引用能够访问bark方法,那么按照相同的逻辑,dog引用也应该能够访问bark方法 所以我只能假设狗引用一定有问题?尽管访问修饰符在继承中起着重要作用,但这个问题不应该与继承混淆。正如@vikss正确地说的,超类不知道下面的继承树,因

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

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

如果husky引用能够访问bark方法,那么按照相同的逻辑,dog引用也应该能够访问bark方法


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

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

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

还有你的代码
d.bark()存在于main方法中,该方法本身是与Huskey对象分离的实体。还有一个有趣的事实,你甚至不能调用
dogd=newdog();d、 树皮()
来自Huskey类的另一个成员方法(这里有访问修饰符),但是您可以在同一个成员方法中直接调用
bark()
方法(这里有继承)。


希望有帮助

好问题。我们知道受保护的
的访问规则(见my),但我们也需要找到理由。@bayou.io感谢您的摘要链接:“只有当B是A的子类,C是B的子类或C是B时,才会授予访问obj.m”如果C是A呢?为什么不行?@wero我刚从链接上读到答案。。。我要问的可能看起来很愚蠢。。。如果public和protected成员都是可见的,那么为什么我们可以访问public字段而不受保护呢?这不是一个小问题。请允许我考虑一下。@bayou.io您对下面给出的答案有什么看法?
Dog d = new Dog();
    d.bark();