该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
题目:下面程序的输出结果是多少?
代码清单1:
import java.util.Date;
public class MyDate extends Date{
public static void main(String[] args) {
new MyDate().test();
}
public void test() {
System.out.println(super.getClass().getName());
}
}
复制代码结果是:MyDate
分析:在test方法中,直接调用getClass().getName()方法,返回的是MyDate类名。由于getClass()在Object类中定义成了final,子类不能覆盖该方法,所以,在test方法中调用getClass().getName()方法,其实就是在调用从父类继承的getClass()方法,等效于调用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也应该是MyDate。
如果想得到父类的名称,应该用如下代码:getClass().getSuperClass().getName();public final Class> getClass()方法,API手册解释是:返回此Object的运行时类。返回的Class对象是由所表示类的 static synchronized 方法锁定的对象。实际结果类型是 Class extends |X|>,其中 |X| 表示清除表达式中的静态类型,该表达式调用 getClass。
this.getClass()是返回运行时对象的类型,但是super.getClass()为何返回的还是子类的类型,还是不明白?
请看实例:代码清单2:
class B extends A {
public void print() {
/*
* 调用A类中的getclass()方法,A是Object的子类,A中的getClass()是Object中的,运行时期
* 的实例是B类,所以输出的依然是Class B
*/
System.out.println(super.getClass());
/*
* 调用B类中的getclass()方法,此方法从A继承的,A从Object继承的,运行时期的实例是B * 类,所以输出的是Class B
*/
System.out.println(this.getClass());
}
}
class A {
}
复制代码上面的super.getClass()和this.getClass()都是调用的Object中的getClass(),而super.getClass()和this.getClass()都是通过实例化B类,调用print(),从而调用这两个方法,运行时期的类都是B,Object中的getClass()返回的是运行时期的类名,所以输出都是Class B