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.
看看这段代码
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.