Java中的继承和该关键字
大家好,我有一个关于Java中“this”关键字的问题。 (1) 假设计算机从机器扩展而来,我们有当前代码: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
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)选择实用的透视图。