【问题标题】:How to access a protected method of superclass in a subclass?如何在子类中访问超类的受保护方法?
【发布时间】:2017-12-09 14:49:45
【问题描述】:

我在两个不同的包中有父子类。我正在覆盖受保护类型的方法。我想访问子类中的超类保护方法。

考虑下面的代码:

package package1;

public class Super
{
    protected void demoMethod()
    {
        System.out.println("In super method");
    }
}

package package2;

import package1.Super;

public class Sub extends Super
{
    @Override
    protected void demoMethod()
    {
        System.out.println("In sub method");
    }

    public static void main(String[] args) 
    {
        //code for accessing superclass demoMethod to print "In super method"
    }
}

在子类的主方法中,我想访问打印“在超方法中”的超类demoMethod。我知道使用超类对象引用调用demoMethod 的子类将看不到demoMethod

有没有可能?如果是,怎么做?

认为我是 Java 新手,并提供答案以替换 main 方法中的注释。

【问题讨论】:

    标签: java inheritance access-modifiers


    【解决方案1】:

    在子类中使用super.demoMethod() 或将其从子类中完全删除

    【讨论】:

    • 如果 OP 如前所述,“使用超类对象引用来调用 demoMethod”,则这些方法都不起作用。超类方法将无法访问。请注意,它位于不同的包中。
    • 同意,因为它是静态的,所以它不能从 main 方法工作
    • 它与 main() 是静态的无关。在这种情况下,main() 方法位于不同的包中。它无法访问来自不同包的受保护成员。
    • protected 允许您从同一个包或父类访问。
    • protected 允许在同一个包内或通过类访问。使用超类对象引用时也不是这种情况。这将导致错误:Super sup = new Sub(); sup.demoMethod()。更多详细信息在 section 6.6.2: Details on protected access 中的 Java 语言规范中:“对象的受保护成员或构造函数可以从包外部访问,在该包中,它仅由负责实现该对象的代码声明。 "
    【解决方案2】:

    您的 main() 方法无法访问 demoMethod() 的超类实现——因为它在子类中被覆盖。

    您的 main() 方法可以访问 demoMethod(),通过子类类型的引用,即使它是受保护的,因为它与您的子类在同一个包中。但它会调用子类实现。

    但是,如果您“使用超类对象引用来调用 demoMethod”,则该方法将无法访问,并且您的代码将无法编译。您的超类位于不同的包中。标记为protected 的方法只能被子类和同一个包中的代码访问。

    如果您在子类和超类中都创建了方法public,则调用demoMethod() 将调用子类实现,无论引用是超类还是子类类型。

    子类的实例可以调用super.demoMethod() 作为其方法实现的一部分。但是 main() 方法不能。

    【讨论】:

    • 那我问的是不可能的,对吧?感谢您的详细说明。
    • 可以,只要本例中的方法是protectedpublic
    • 不适用于您当前的访问限定符和方法实现。如果Super.demoMethod() 是公开的,您可以在 Super 实例上的 package2 中调用它,因为 Super 没有被声明为抽象的。但我猜你想创建一个 Sub 类型的对象。 main() 方法不能调用超类实现,但 Sub 的实例方法可以。
    • 感谢安迪澄清。 (y)
    猜你喜欢
    • 2013-05-27
    • 1970-01-01
    • 2018-07-15
    • 2012-12-01
    • 2012-11-25
    • 2013-06-08
    • 2011-07-09
    • 2015-11-04
    • 2012-10-23
    相关资源
    最近更新 更多