Java` this`在继承情况下实际指的是什么?

Kir*_*ill 8 java oop inheritance constructor this

为什么以下Java代码会产生:

10
superclass
Run Code Online (Sandbox Code Playgroud)

有问题的代码是:

class SuperClass {
    int a;

    public SuperClass() {
        this.a = 10;
    }

    private void another_print() {
        System.out.println("superclass");
    }

    public void print() {
        System.out.println(this.a);
        this.another_print();
    }
}

class SubClass extends SuperClass {
    int a;

    public SubClass() {
        this.a = 20;
    }

    private void another_print() {
        System.out.println("subclass");
    }

    public void print() {
        super.print();
    }
}

public class Main {
    public static void main (String[] args) {
        SubClass c = new SubClass();
        c.print();
    }
}
Run Code Online (Sandbox Code Playgroud)

没有SuperClass创造过的实例,不存在吗?不仅Java开始寻找从中调用的方法SuperClass,它甚至以某种方式知道这一点a = 10!

让我们考虑类似的Python代码:

class SuperClass:
    def __init__(self):
        self.a = 10

    def another_prn(self):
        print('superclass')

    def prn(self):
        print(self.a)
        self.another_prn()

class SubClass(SuperClass):
    def __init__(self):
        self.a = 20

    def another_prn(self):
        print('subclass')

    def prn(self):
        super().prn()

c = SubClass()
c.prn()
Run Code Online (Sandbox Code Playgroud)

它按预期工作:

20
subclass
Run Code Online (Sandbox Code Playgroud)

我的同事(Python不喜欢Java人员)提出的唯一解释是:"Python不是真正的OOP语言".根本不是很有说服力.

更新:private void another_print()是我的错误,我应该使用protected.

pet*_*rov 8

在子类的打印中,您只需调用超类的打印方法.所以它当然从超级类打印出来的.

这里有两个单独字段.字段不受覆盖,只有方法.超类有一个领域,你有另外一个在子类字段.

如果另一种语言产生另一种结果,那不是一个大惊喜.此外,我不确定您的Python代码在逻辑上是否等同于/类似于您的Java代码.


Ido*_*dos 8

它是用Java调用的构造函数的顺序.
SubClass实例化时c,构造函数隐式调用SuperClass(public SuperClass())的默认构造函数(必须这样做).然后a设置为10 SuperClass.

现在,我们正在与进行SuperClass构造,我们回到的构造SubClass,其分配a = 20.但字段不受制于Java的重写,所以aSuperClass仍是10.

在那之后很明显,我们调用c.print()调用printof SubClass,调用printof SuperClass(by super.print()),打印a出你记忆中的10个.然后another_print(因为它没有被覆盖private)只是打印superclass而且我们已经完成了.