Java中的继承和此关键字

时间:2015-03-23 18:01:15

标签: java inheritance reference this

大家好,我有与此相关的问题' Java中的关键字。 (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

这意味着'这个'在计算机中指的是计算机,这是我理解但是这个'这个'在机器中也指计算机,这是我无法理解的。

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

所以那些回答我的人,我可以理解这与new或我们所说的类型指向的内容有关......?

7 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

关键字this是指当前的对象,它是类的实例,而不是类本身。您创建了一个对象(new Computer()),它是Computer的一个实例。由于ComputerMachine的子类,因此它也是Machine的实例,但默认的toString()方法将返回包含最精确类型的字符串,在本例中Computer

答案 2 :(得分:0)

你不能从类中访问私有变量,你必须创建getter方法或将变量设为public,而且在System.out.println()中调用toString()方法,如果未定义,则打印类似的东西你有结果(对象的类型和内存中的位置)。

只需在Machine类中创建方法:

public String getName() {
   return name;
}

在main方法中添加以下内容:

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

答案 3 :(得分:0)

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

"这"指的是对象,而不是类。

答案 4 :(得分:0)

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

当您实例化Computer时,您正在运行所有方法。

答案 5 :(得分:0)

this引用您所处的上下文。在您的情况下,您在MachineComputer类上使用它。

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

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

调用indifferently witch方法,你进行方法调用的对象是相同的,this关键字将引用同一个对象,然后,你的测试结果将是完全相同的对象:

Computer@1db9742
Computer@1db9742

答案 6 :(得分:0)

这是真实的类型。不是参考。 举个例子:

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的一些甜头。