Java私有方法覆盖

时间:2011-09-26 07:29:36

标签: java oop

我遇到了这种情况。我们有一个类让我们说主要有私人方法打印。另一个类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类的一部分。

4 个答案:

答案 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对象)提供了!)