Java中的继承和该关键字

Java中的继承和该关键字,java,inheritance,reference,this,Java,Inheritance,Reference,This,大家好,我有一个关于Java中“this”关键字的问题。 (1) 假设计算机从机器扩展而来,我们有当前代码: public class Machine { private String name = "Machine"; public void test() { System.out.println(this.name); } public void test2() { System.out.println(this

大家好,我有一个关于Java中“this”关键字的问题。 (1) 假设计算机从机器扩展而来,我们有当前代码:

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
这意味着计算机中的“this”指的是计算机,这是我理解的但计算机中的“this”也指的是计算机,这是我不理解的。

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


因此,对于所有回答我的人,我可以理解这与新的或我们所说的类型指向什么有关…?

这个
是指向当前对象的指针,对象知道它们是什么类型。

关键字
这个
指的是当前对象,即类的实例,而不是类本身。您已经创建了一个对象(使用
new Computer()
),它是
Computer
的一个实例。由于
Computer
Machine
的一个子类,它也是
Machine
的一个实例,但是默认的
toString()
方法将返回一个包含最精确类型的字符串,在这种情况下
Computer

您无法从类访问私有变量,您必须创建getter方法或将变量公开,而且这个in-System.out.println()调用toString()方法,如果未定义,它将打印结果中的内容(对象类型和内存中的位置)

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

public String getName() {
   return name;
}
并在主要方法中添加以下内容:

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

Computer@1db9742只是对象的名称。它是相同的对象,即使每个方法定义在不同的类中


“this”指的是对象,而不是类。

计算机
扩展了
机器
,因此
计算机
继承了
机器
的所有方法,使它们成为自己的方法


当您实例化计算机时,您正在运行它的所有方法。

引用您所处的上下文。在您的情况下,您正在
机器
计算机
类上使用它

要理解这一点,您首先需要了解变量
Machine m
,它不是对象本身,而是引用内存中的对象

然后,从同一个对象调用两个不同的方法,一个在对象类(
计算机
)上实现,另一个在其超类(
机器
)上实现

不管调用了哪个witch方法,进行方法调用的对象都是相同的,并且
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?不知道该怎么办:(
。动物的声音到底是什么?你知道吗

如果有人要你带动物,你可以带一只猫,对吗? 这就是要求动物参数的方法的情况: 采取以下措施:

void doSomething(Animal param){
// some code
}
您可以使用Cat对象作为参数来调用它:

//...
doSomething(new Cat());
//...
等等…(你可以把这个类比推广到更广的层面)


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

您希望发生什么?为了补充@AndyTurner的答案,我建议您在教科书中查阅有关此主题的完整论文中的继承。计算机中的“这”并不是指“计算机”。它指的是Computer@1db9742(或“Machine c”,您声明的变量),一个对象,而不是类。如果您问为什么返回Computer Not Machine,我不理解您程序的目的,因为您明确声明您的对象就是Computer:Machine c=new Computer();谢谢,我理解你所说的,但取决于你的概念,如果每只猫都是动物,那么如果我这样做的话,就可以得到一只动物,因为猫就是动物。我看到你在那里做了什么。JVM寻找最受限制的解析类型,当然,它仍然为当前上下文提供了适当的条件。我只想补充一下,我们将有两种情况:采用更广泛的类型(动物)或受限类型(猫)。Java(通常是OOP)选择实用的透视图。