2017-06-28 117 views
1

问题:以下代码的结果是“5 A”和“10 B”。对于b.print(),this.num是对A类对象的引用,而this.getClass()是对B类对象的引用?Java继承 - 访问私有变量/ getClass()

超类甲

public class A { 
    private int num; 

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

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

子类乙

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

把'this.'放在方法调用之前没有效果。 –

+1

它们是两个不同的对象,它们都获得了传递的数字。我不明白为什么这会让人困惑。 – byxor

回答

0

这是两个不同的薄GS。

this.getClass()或者更简单地getClass()(如this隐含不指定)总是指实际运行时类,可能是使用它或它的子类。如果你从A中调用它,它将返回A类,但如果你从它的一个子类调用它,它将返回这个子类。

虽然this.num引用A类中声明的特定实例字段。
当你代码引用这个字段时,它必然依赖于声明这个特定字段的类。

0

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

public class B extends A { 

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

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

然后当你调用打印方法,它会调用这一个,而不是父之一,即使你使用this.print()之类的任何方法内部的

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

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