Java继承 - 访问私有变量/ getClass()

时间:2017-06-28 13:55:26

标签: java inheritance this

问题:以下代码的结果是" 5 A"和" 10 B"。对于b.print(),this.num是如何引用A类对象而this.getClass()是对B类对象的引用?

超类A

public class A {
  private int num;

  public A(int num) {
    this.num = num;
  }

  public void print() {
    System.out.println(this.num + " " + this.getClass().getName());
  }
}

子类B

public class B extends A {

  public B(int num) {
    super(num);
  }
}

主要方法

A a = new A(5);
B b = new B(10);
a.print();
b.print();

2 个答案:

答案 0 :(得分:0)

这是两个截然不同的事。

this.getClass()或更简单地getClass()(因为this暗示未指定)将始终引用实际的运行时类,该类可能是使用它的类或其子类。如果你从A中调用它,它将返回A类,但是如果你从它的子节点调用它,它将返回这个子类。

虽然this.num引用A类中声明的特定实例字段。
当您编写代码时引用此字段,它必然依赖于声明此特定字段的类。 / p>

答案 1 :(得分:0)

每当您在实例中调用this时,您将调用实际实例,而不是“类”。例如,在您的情况下,如果您覆盖B类中的方法print,就像这样;

public class B extends A {

    public B(int num) {
        super(num);
    }

    public void print() {
        System.out.println("PRINTING B");
    }
}

然后当你调用print方法时,即使你在A类的任何方法中使用this.print(),它也会调用这个方法而不是父方法

如果你真的想明确打印A类,那么你需要像这样引用它:

    public void print() {
        System.out.println(this.num + " " + A.class.getName());
    }