java super.getClass问题

非常著名的坑了,简单描述就是在A的子类B中某个方法里调用super.get().getName();得到的是A还是B?

答案都是知道,是B。查阅了网上很多说法都是逆推法,例如下例:

import java.util.Date;
public  class Test extends Date{
    public static void main(String[] args) {
        new Test().test();
    }

    public void test(){
        System.out.println(super.getClass().getName());
    }

}
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">证明思路是:getClass()方法是Object的final方法,是不能被覆盖继承的。也就是说能继承使用,但不能自己重写。然后在Test类里调用getClass().getName();得到的是Test的</span>

类名,因为不是重写的,所以只能是继承的,也就是在Test里调用getClass就等于调用super.getClass;故得证。

但是我总觉得这个解释并不能说服我,然后继续查阅资料,发现这样一种解释:

/**
     * Returns the runtime class of this {@code Object}. The returned
     * {@code Class} object is the object that is locked by {@code
     * static synchronized} methods of the represented class.
     **/

这个是Object中的getClass方法的注释,是指返回此时运行的类。

释义指出,要返回此Object运行时类,这外当然不可能指Object自己了,否则所有类调用getClass()方法都返回Object.class了

这样就比较容易理解了。因为getClass是native的,也就是说是java自己已经实现了的,目的很明确就是返回当前运行对象的类信息,注意是运行的,上方运行的是Test的对象,当然返回的就是Test类信息了。

下面附上一个简单的验证实例:

public class Cat {

	public final void speak(){
		System.out.println("the class==="+getClass().getName());
	}
}
public class RedCat extends Cat{

}
public class SmallRedCat extends RedCat{

	public void test(){
		super.speak();
	}
	public static void main(String[] args) {
		SmallRedCat rc = new SmallRedCat();
		rc.test();
		RedCat redCat = new RedCat();
		redCat.speak();
	}
}

运行结果是:

the class===com.test.SmallRedCat

the class===com.test.RedCat

参考:http://www.cnblogs.com/o-andy-o/archive/2012/12/22/2829563.html

时间: 2024-11-07 06:09:00

java super.getClass问题的相关文章

【Java面试题】14 super.getClass()方法调用

下面程序的输出结果是多少? import java.util.Date; public class Test extends Date{ public static void main(String[] args) { new Test().test(); } public void test(){ System.out.println(super.getClass().getName()); } } 在test方法中,直接调用getClass().getName()方法,返回的是Test类名.

Java的super调用案例: super.getClass()返回的是子类自己

If you override a method from your superclass (or your superclass's superclass etc.), super.theMethod() will invoke the original method instead of the one you overrode it with. If you did not actual override theMethod, super.theMethod() will act exac

super.getclass()的结果是父类还是子类?

package as; import java.util.Date; public class Test extends Date{ public static void main(String[] args) { new Test().test(); } public void test(){ System.out.println(super.getClass().getSuperclass().getName()); System.out.println(super.getClass().g

super.getClass()与this.getClass()

原文地址:http://leihuang.org/2014/11/14/getClass-method/ 首先看一段代码: import java.util.Date; public class Test extends Date{ public static void main(String[] args) { new Test().test(); } public void test(){ System.out.println(super.getClass().getName()); } }

关于java中getClass()和getSuperClass()的讲解

为了讲解这个问题,我们先来看一下下面的代码: package com.yonyou.test; import java.util.Date; class Test extends Date{ private static final long serialVersionUID = 1L; public static void main(String[] args) { new Test().print(); } public void print(){ System.out.println("当

this.getClass()和super.getClass()得到的是同一个类

今天dubug代码时发现this.getClass()和super.getClass()得到的竟然是同一个类,都是当前类. 遍访网络资料得出: getClass()不受this和super影响,而是有当前的运行类决定的. 详细解释: getClass public final Class<? extends Object> getClass()返回一个对象的运行时类.该 Class 对象是由所表示类的 static synchronized 方法锁定的对象. 返回: 表示该对象的运行时类的 j

super.getClass().getName()

答案 : test.SuperTest 1.首先 super.getClass() 是父类的getClass()方法,其父类是Date,它的getClass()方法是继承自Object类而且没有重写, 所以就是调用object的getClass()方法.而看一下getclass的方法解释如下图   所以可以知道是返回当前运行时的类.   2.在调用getName()方法而getName()是:包名+类名 原文地址:https://www.cnblogs.com/xieguolin/p/10399

Java——super

在Java类中使用super来引用基类的成分. [代码] [内存分析] 注: <1>super指向的是当前子类对象的父类,因此指向的是FatherClass. <2>this指向的是对象自身.

Java super和this

this this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. this的用法在java中大体可以分为3种: 1.普通的直接引用 这种就不用讲了,this相当于是指向当前对象本身. 2.形参与成员名字重名,用this来区分: super super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类. super也有三种用法: 1.普通的直接引用 与this类似,super相当于是指向当前对象的父类,这样就可以用super.xxx来引用父类的