How to access a protected method of superclass in a subclass?
我有两个不同的包中的父子类。我正在重写受保护类型的方法。我想访问子类中的超类保护方法。
考虑以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| 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,它输出"in super method"。我知道,使用超级类对象引用调用demoMethod,从子类中看不到demoMethod。
有没有可能?如果是,怎么办?
请考虑我新到Java,并提供替换主方法中的注释的答案。
在子类中,使用super.demoMethod()或将其从子类中完全删除。
- 如前所述,如果op"使用超类对象引用调用demomethod",那么这两种方法都不起作用。超类方法将不可访问。请注意,它在另一个包中。
- 同意,因为它是静态的,所以不能从主方法工作
- 它与main()是静态的没有任何关系。在这种情况下,main()方法在另一个包中。它无法从其他包访问受保护的成员。
- protected允许您从同一个包或父类访问。
- protected允许在同一个包内或通过子类访问。在使用超类对象引用时也不是这样。这将导致错误:Super sup = new Sub(); sup.demoMethod()。更多的细节在Java语言规范的第63.2节中:关于受保护访问的细节:"对象的受保护成员或构造函数可以从包的外部访问,在该包中仅由负责实现该对象的代码声明。"
您的main()方法无法访问demoMethod()的超类实现,因为它在子类中被重写。
您的main()方法可以通过子类类型的引用访问demoMethod(),即使它是受保护的,因为它与子类在同一个包中。但它将调用子类实现。
但是,如果您"使用超类对象引用调用demomethod",则该方法将不可访问,并且您的代码将不会编译。您的超类在另一个包中。标记为protected的方法只能由子类和同一包中的代码访问。
如果在子类和超类中都使用了方法public,那么调用demoMethod()将调用子类实现,而不管引用是超级类型还是子类类型。
子类的实例可以调用super.demoMethod()作为其方法实现的一部分。但是main()方法不能。
- 所以我要问的是不可能的,对吧?谢谢你的精心设计。
- 是的,只要这种情况下的方法是protected或public。
- 不适用于当前的访问限定符和方法实现。如果Super.demoMethod()是公共的,您可以在super实例上从package2调用它,因为super没有声明为抽象的。但是我猜你想创建一个Sub类型的对象。main()方法不能调用超类实现,但是Sub的实例方法可以。
- 谢谢你澄清安迪。(Y)