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
的一个实例。由于 Computer
是 Machine
的子 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
引用您所在的上下文。在您的情况下,您在 Machine
和 Computer
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 的一些优点。
大家好,我有 与 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
的一个实例。由于 Computer
是 Machine
的子 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
引用您所在的上下文。在您的情况下,您在 Machine
和 Computer
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 的一些优点。