[英]Java private method override
我遇到了这种情况。 我们有一个类让我们说主要有私人方法打印。 另一个类Main1扩展了Main类并重新定义了print方法。 由于main1是Main1类的对象,我希望调用main1 print方法...
public class Main {
public static void main(String[] args) {
Main main1 = new Main1();
List<String> list = new ArrayList<String>();
main1.print(list);
}
private void print(List<String> string) {
System.out.println("main");
}
}
class Main1 extends Main {
public void print(List<String> string) {
System.out.println("main1");
}
}
在这种情况下,当我们运行程序时,它会打印“main”。 它真的让我感到困惑,因为该方法是私有的,甚至不是Main1类的一部分。
答案并不太难:
main1
变量的类型是Main
( 不是 Main1
) print
,它接受Main
上的List<String>
是私有方法 Main
类中,因此它可以调用该类中的私有方法 因此将调用Main.print(List<String>)
。
请注意,将main1
的类型main1
为Main1
将导致Main1
另一个 print(List<String>)
方法。
如果您希望能够覆盖您的print
方法,则必须将其声明为public
:
public class Main {
public void print(List<String> string) {
}
}
否则,它将调用您的私有方法,而不在派生类中查找实现。
不继承私有方法,并且代码中不会发生方法重写。 您可以通过在Main1.print()方法中放置@Override注释来看到这一点。 如果您放置该注释,则生成编译错误。
Main.java:17: method does not override or implement a method from a supertype
@Override
^
1 error
在您的情况下,Main1.print()和Main.print()是不同的,彼此不相关(没有覆盖,没有重载)。 因此,如果将main1指定为Main,则将调用Main.print()。 如果将main1指定为Main1,则将调用Main1.print()。
你的main1是一种Main类型,但实例化为Main1! 没关系,因为它是Main的子类。 但是,当你调用print方法(BTW,它应该是main1.print(list);)时,它将调用Main类中的private方法! 如果将方法的可见性更改为protected或public,则在这种情况下,将调用Main1类中的print方法,因为实例化对象的多态行为(请记住,它毕竟是基于您的代码的Main1对象)提供了!)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.