【问题标题】:Why super class method being called here?为什么在这里调用超类方法?
【发布时间】:2015-02-17 21:01:33
【问题描述】:

这是我的代码

class Hello{
    void method(){
        System.out.println("super method");
        meth();
    }
    private void meth(){
        System.out.println("sup meth");
    }
}
public class HelloWorld extends Hello{
    //@Override - would fail as meth is private in Hello
    protected void meth(){
        System.out.println("sub meth");
    }
    protected void method(){
        super.method();
    }
     public static void main(String []args){
        new HelloWorld().method();
     }
}

返回结果是

super method
sup meth

但是为什么?不应该打印出来吗

super method
sub meth 

如果我在Hello 中将meth 方法写为public 并在HelloWorld 中覆盖它

结果就是上面提到的一个。 从method 调用meth 仍然调用子类的meth,即使meth 调用在超类内部,从词汇上讲! 那么,当 meth 是 private 时,为什么会有不同的行为呢?

_____________编辑_____________

代码是这样的吗

class Hello{
    void method(){
        System.out.println("super method");
        meth();
    }
    protected void meth(){
        System.out.println("sup meth");
    }
}
public class HelloWorld extends Hello{
    //@Override - would fail as meth is private in Hello
    protected void meth(){
        System.out.println("sub meth");
    }
    protected void method(){
        super.method();
    }
     public static void main(String []args){
        new HelloWorld().method();
     }
}

o/p 是

super method
sub meth

因此,即使超类 Hello 中的 method 正在调用 meth ,实际上子类的 meth 正在被调用。所以,方法调用不是词法意义上的!即,即使看起来超类的 meth 将被调用,它实际上的子类的 becoz 子类实例首先调用了method。 为什么meth private 在超类中时会有所不同

【问题讨论】:

    标签: java inheritance private overriding


    【解决方案1】:

    你不能像编译器告诉你的那样覆盖私有方法。所以超类唯一知道的 meth() 就是它自己的。

    你不能重写私有方法,因为它是类内部的,所以它的子类甚至不知道它的父类的私有方法存在。

    【讨论】:

    • 我同意!但即使控件在超类内部,它仍然是发号施令的子类对象。这就是为什么该方法不是私有的,子类方法版本会被调用。现在在这种情况下,正如你所说,私有超类方法甚至不知道子类实例存在。因此,如果子类实例实际上调用了子类 meth(),尽管是从超类方法内部调用,那是很自然的。请澄清我的概念是否错误
    【解决方案2】:

    您的方法meth()private,子类无权访问它。

    【讨论】:

    • 我同意!但即使控件在超类内部,它仍然是发号施令的子类对象。这就是为什么该方法不是私有的,子类方法版本将被调用。现在在这种情况下,正如你所说,私有超类方法甚至不知道子类实例存在。因此,如果子类实例实际上调用了子类 meth(),尽管是从超类方法内部调用,那是很自然的。请澄清我的概念是否错误
    【解决方案3】:

    Super 类从自身调用 meth(),因此,它正在寻找 this.meth()。 super 甚至不知道子类的 meth() 因为 1)它在子类中,2)子类方法是私有的。

    我建议阅读继承: Java Inheritance

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 2011-02-25
      • 2018-08-22
      相关资源
      最近更新 更多