我遇到了这种情况。我们有一个类让我们说主要有私人方法打印。另一个类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类的一部分。
答案 0 :(得分:13)
答案并不太难:
main1
变量的类型为Main
(不 Main1
)print
唯一可能接受List<String>
Main
的方法是私有方法Main
内,因此它可以调用该类中的私有方法因此会调用Main.print(List<String>)
。
请注意,将main1
的类型更改为Main1
会导致调用其他 print(List<String>)
方法。
答案 1 :(得分:1)
如果您希望能够覆盖print
方法,则必须声明public
:
public class Main {
public void print(List<String> string) {
}
}
否则它将调用您的私有方法,而不在派生类中查找实现。
答案 2 :(得分:1)
不会继承私有方法,并且代码中不会发生方法覆盖。 您可以通过在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()。
答案 3 :(得分:1)
你的main1是一种Main类型,但实例化为Main1!没关系,因为它是Main的子类。但是,当你调用print方法(BTW,它应该是main1.print(list);)时,它将调用Main类中的private方法!如果将方法的可见性更改为protected或public,则在这种情况下,将调用Main1类中的print方法,因为实例化对象的多态行为(请记住,它毕竟是基于您的代码的Main1对象)提供了!)