Java私有方法覆盖

我遇到了这种情况。 我们有一个类让我们说主要有私人方法打印。 另一个类Main1扩展了Main类并重新定义了print方法。 由于main1是Main1类的对象,我希望调用main1 print方法…

public class Main { public static void main(String[] args) { Main main1 = new Main1(); List list = new ArrayList(); main1.print(list); } private void print(List string) { System.out.println("main"); } } class Main1 extends Main { public void print(List string) { System.out.println("main1"); } } 

在这种情况下,当我们运行程序时,它会打印“main”。 它真的让我感到困惑,因为该方法是私有的,甚至不是Main1类的一部分。

答案不是太难:

  • main1变量的类型Main不是 Main1
  • 所以你只能调用那种类型的方法
  • 唯一可能的方法是print ,它接受Main上的List是私有方法
  • 调用代码在Main类中,因此它可以调用该类中的私有方法

因此将调用Main.print(List)

请注意,将main1的类型main1Main1将导致Main1 其他 print(List)方法。

如果您希望能够覆盖您的print方法,则必须将其声明为public

 public class Main { public void print(List string) { } } 

否则,它将调用您的私有方法,而不在派生类中查找实现。

不inheritance私有方法,并且代码中不会发生方法覆盖。 您可以通过在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对象)提供了!)