【问题标题】:Inheritance and this keyword in JavaJava中的继承和this关键字
【发布时间】:2015-03-23 18:01:14
【问题描述】:

大家好,我有与 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

意思是Computer中的“this”指的是Computer,这是我理解的但是Machine中的“this”也指的是Computer,这是我不理解的。

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

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

【问题讨论】:

  • 你预计会发生什么?
  • 要添加到@AndyTurner 的答案,我建议您在教科书中阅读继承,以获得有关此主题的完整论文。
  • “计算机”中的“this”不是指“计算机”。它指的是Computer@1db9742(或“Machine c”,您声明的变量),一个对象。不是班级。

标签: java inheritance reference this


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        只需在 Machine 类中创建方法:

        public String getName() {
           return name;
        }
        

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

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

        【讨论】:

        • 我不明白你的程序的目的,如果你问为什么返回 Computer not machine 是因为你明确声明你的对象是计算机:Machine c = new Computer();跨度>
        【解决方案5】:

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

        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 :(。动物的声音到底是什么?看到了吗?

        如果有人要求您带动物,您可以随时带猫。对 ? 好吧,要求动物参数的方法就是这种情况: 取这个函数:

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

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

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

        等等..(你可以将类比推到更广的层面)

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

        【讨论】:

        • 谢谢,我明白你的意思,但是根据你的概念,如果每只猫都是动物,那么如果我这样做'这个'就可以得到动物,因为猫是动物。
        • 我知道你在那里做了什么。当然,JVM 会寻找仍然为当前上下文提供适当条件的最受限制的已解析类型。
        • 我只是想补充一点,毕竟我们会有两种情况:采用更广泛的类型(动物)或受限类型(猫)。 Java(一般是OOP)选择实用的角度。
        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

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

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

          无所谓的witch方法被调用,你调用方法的对象是一样的,this关键字,会引用同一个对象,然后,你的测试结果就是同一个对象:

          Computer@1db9742
          Computer@1db9742
          

          【讨论】:

            猜你喜欢
            • 2012-12-15
            • 1970-01-01
            • 2011-12-11
            • 2014-05-28
            • 2017-08-25
            • 1970-01-01
            • 2014-02-27
            • 2011-05-20
            • 2018-05-30
            相关资源
            最近更新 更多