【问题标题】:Overriding private method覆盖私有方法
【发布时间】:2014-05-28 00:02:46
【问题描述】:

我们不能覆盖私有方法,那么为什么下面的代码没有给出错误。相反,它会产生输出。

class A {
    private void fun() {
        System.out.println("ths is a private method");
    }
}

class B extends A {
    void fun() {
        System.out.println("ths is wrng");
    }
}

class C {
    public static void main(String args[]) {
        B ob = new B();
        ob.fun();
    }
}

【问题讨论】:

    标签: java private overriding


    【解决方案1】:

    private 方法不会被继承。在您的main 方法中,您正在对B 类型的变量调用fun() 方法。 B 类型的 fun() 方法似乎是可访问的,假设您的类 B 和类 C 在同一个包中。

    你这样做了吗

    A ob = new B();
    ob.fun();
    

    那么你会得到你的编译错误。

    B#fun() 与A#fun() 完全无关。

    【讨论】:

      【解决方案2】:

      两者是完全不同的方法,彼此无关。由于私有方法不是继承的,因此这里没有覆盖的概念。

      【讨论】:

        【解决方案3】:

        方法fun() 没有在B 类中被覆盖,因为它从未从类A 继承。

        您在代码中调用的是B 类的方法,与A 类和A#fun() 方法无关。

        要检查这一点,请添加 @Override 注释,您将收到编译时错误。

        // Compilation error.
        Class B extends A{
           @Override
           void fun(){
              System.out.println("ths is wrng");
           }
        }
        

        现在这段代码将无法编译。

        【讨论】:

          【解决方案4】:

          首先,私有方法不会在子类中继承。如果你仍然尝试编写一个与父类同名的方法,java编译器会将子类中的方法视为一个全新的方法,不会抛出任何异常。就像子类中的新方法遮蔽了父类中的私有方法一样。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-04-09
            • 2011-01-01
            • 2013-01-31
            • 2021-09-09
            • 1970-01-01
            • 2014-03-06
            相关资源
            最近更新 更多