Java 中的继承和 this 关键字

Inheritance and this keyword in Java

大家好,我有 与 Java 中的 'this' 关键字相关的问题。 (1) 假设 Computer 从 Machine 扩展而来,我们有当前代码:

public class Machine {
    private String name = "Machine";
    public void test()
    {
        System.out.println(this.name);
    }
    public void test2()
    {
        System.out.println(this);
    }
}

public class Computer extends Machine {
    public void test()
    {
        System.out.println(this);
    }
}

public class main {

    public static void main(String[] args) {
        Machine c = new Computer();
        c.test();
        c.test2();
    }

}

其打印:

Computer@1db9742
Computer@1db9742

意思是Computer中的'this'指的是Computer,这是我理解的但是Machine中的'this'也指的是Computer,这是我不理解的.

这是怎么发生的,为什么..??? (2) 那么如果 Machine m = new Computer() 这是真的吗?

所以对于所有回答我的人,我可以理解这与 new 或我们所说的我们的类型指向...?

this是指向当前对象的指针,对象知道自己是什么类型。

关键字this引用当前对象,即class的实例,而不是 class 本身。您已经创建了一个对象(new Computer()),它是 Computer 的一个实例。由于 ComputerMachine 的子 class,它也是 Machine 的实例,但是默认的 toString() 方法将 return 一个字符串包含最精确的类型,在本例中为 Computer.

您不能从 class 访问私有变量,您必须创建 getter 方法或创建变量 public,而且这在 System.out.println() 调用中toString() 方法,如果未定义,它会打印类似于结果中的内容(对象类型和内存中的位置)。

只需在机器中创建方法 class:

public String getName() {
   return name;
}

并在主要方法中添加以下内容:

System.out.println(c.getName());

Computer@1db9742 只是您的对象的名称。它是同一个对象,即使每个方法定义在不同的 class.

"this" 指对象,而不是 class.

Computer 扩展了 Machine,因此 Computer 继承了 Machine 的所有方法,使它们成为自己的方法。

当您实例化 Computer 时,您就是 运行 它的所有方法。

this 引用您所在的上下文。在您的情况下,您在 MachineComputer class.[=18= 上使用它]

要理解这个,首先要明白变量Machine m,并不是对象本身,而是引用了内存中的对象

然后,您从同一个对象调用两种不同的方法,一种是在对象 class(Computer) 上实现的,另一种是在其超对象上实现的class(Machine).

无所谓方法调用,你调用方法的对象是同一个,this关键字,会引用同一个对象,然后,你的测试结果将是完全相同的对象:

Computer@1db9742
Computer@1db9742

重要的是实例化类型。不是参考。 举个例子:

class Animal{
     void makeSound(){
           System.out.println("wut ? Don't know what to do :(");
     }
}
class Cat extends Animal{
     void makeSound(){
           System.out.println("Miaw !");
     }
}

当您创建例如:

Animal a = new Cat();

你实际上是在创造一只猫。而且,猫始终是动物? (我说得对吗?:D) a.makeSound() 将导致打印 Miaw !。但是!

Animal a= new Animal();
a.makeSound();

将导致打印: wut ? Don't know what to do :( 。到底什么是动物的叫声?你看到了吗?

如果有人要你带动物,你总是可以带猫。正确的 ? 好吧,请求 Animal 参数的方法就是这种情况: 采取这个功能:

void doSomething(Animal param){
// some code
}

您可以使用 Cat 对象作为参数来调用它:

//...
doSomething(new Cat());
//...

等等(你可以把比喻推到更广的层次)

Java VM 负责在 运行 时进行类型解析,以决定调用哪个方法。这就是 OOP 的一些优点。