Java继承和this关键字

Java Inheritance and this keyword

看看这段代码

public class Machine {
    public String name = "Machine";
    public static int j = 5;

    public void run() {
        System.out.println("Machine is running");
        System.out.println(this.name);
    }

    public void run2() {
        System.out.println("Machine is running");

        System.out.println(this.name);
        this.run();
    }
}

public class Computer extends Machine {
    String name = "Computer ";

    public void run() {
        System.out.println("Computer is running");
    }
}

public class Cpu extends Computer {
    public String name = "Cpu ";

    public Cpu() {
        System.out.println("Constructor of cpu");
    }

    public void run() {
        System.out.println("Constructor cpu is running");
        System.out.println(this);
    }

    public void getComputerName() {
        System.out.println(super.name + " Really?");
    }
}

public class main {

    public static void main(String[] args) {
        Cpu c = new Cpu();
        c.run2();
    }
}

打印:

Constructor of cpu
Machine is running
Machine
Constructor cpu is running
Cpu@1db9742

我的问题是,为什么当我们将 this 关键字与函数一起使用时,它会转到 this 引用的位置并激活该函数,但是当我们将它与字段一起使用时,它只会与字段的字段一起使用当前 class?就像示例中的那样

当您为 Cpu 执行 运行2 方法时,将调用 Machine 中的父方法,因为它未在 Cpu 中被覆盖。在该范围内,this.name 指的是 Machine 的字段。

当 运行2() in Machine 调用 this.run() 时,它在正在执行的对象上调用它 - Cpu。 Cpu 覆盖 运行(),因此该方法被调用。在 Cpu.run 的范围内,字段名称是 Cpu class 的字段名称。 "this" 也指 Cpu class。

您不能覆盖变量,只能覆盖方法。您正在 CPU 中创建一个包含值的新变量,而不是覆盖超类中指定的值。


与问题无关,但是:

CPU 不应扩展 Computer,因为 CPU 不是 Computer。使用 'is-a' 技巧来确定是否应该扩展。一个Computer'has-a'CPU,所以要用composition.