问题:以下代码的结果是" 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();
答案 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());
}