原文地址: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());}
}

上面这段代码的输出为:Test

可能你会奇怪为什么输出的是Test,而不是Date呢?我明明是调用的super.getClass()啊。我们先不急,先来了解一下getClass()方法的机制是什么。以下时getClass()在Object类中实现的源代码。

Returns the runtime classof this Object. The returned Class object is the object that is locked by static synchronized methods of the represented class. The actual result type is Class<? extends |X|> where |X| is the erasure of the static type of the expression on which getClass is called. For example, no cast is required in this code fragment: Number n = 0; Class<? extends Number> c = n.getClass(); Returns: The Class object that represents the runtime class of this object.

public final native Class<?> More ...getClass();

从上面我们能够得知两点:

  1. getClass()方法: 返回此 Object 的执行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
  2. getClass()时final方法。子类无法重写。

第一点我们能够得出:

什么是执行时类。执行时类是Object的一个实例,注意了,关键来了。他返回的不是Object.class。他返回的是执行时类,就是虚拟机中是谁在执行就是谁,假设你new Date(),Date当然是执行时类。而不是Object,否则全部类的getClass()方法都返回了Object.class 了。

依据上一段解释。Date是Object的子类,Date.getClass()返回的肯定是Date.class,

相同的Test继承Date。假如有一个属于Date的getClass()他返回的也不可能是Date.class,由于当new Test()后,Test是一个执行时类,仅仅只是他拥有Date的资源结构。所以谁被实例化,谁就是一个执行时类。

第二点我们能够得出

上面我们讨论了,Object中getClass()方法返回的是执行时类对象,谁被实例化。getClass()就得到谁。但那仅仅是Object中的getClass()方法而已,而我们时调用的Date.getClass(),or Test.getClass().

这里就涉及到getClass()方法在Object中时final方法了。因此子类是无法重写getClass方法的,所以无论是Date.getClass()还是Test.getClass()。事实上调用的都是Object中的getClass()方法。这样就保证了会遵循第一点。

假设想要从Test中得到Date.class,能够用Test.getClass().getSuperClass();


2014-11-14 12:06:54

Brave,Happy,Thanksgiving !

版权声明:本文博主原创文章。博客,未经同意不得转载。

super.getClass()与this.getClass()相关推荐

  1. super.getClass()与this.getClass()的问题

    题外话: 最近看多线程方面的东西,看到可重入锁的时候,当中有个父类方法a加锁,子类的方法b(覆盖了a方法)也加锁.方法b又会调用a,导致会出现死锁问题,因为两个在处理的时候,都会要拿父类的对象锁.可重 ...

  2. java中的getclass()函数_JavaScript getClass() 函数

    定义和用法 getClass() 函数可返回一个 JavaObject 的 JavaClass. 语法 getClass(javaobj) 参数 描述 javaobj 一个 JavaObject 对象 ...

  3. java中getClass().getResourceAsStream()与getClass().getClassLoader().getResourceAsStream()的区别

    https://blog.csdn.net/J080624/article/details/53171176 转载于:https://www.cnblogs.com/quxiangxiangtiang ...

  4. super.getClass()方法调用返回结果的原因

    http://bbs.csdn.net/topics/370010127 看到Java笔试题中有一道关于super的题,题目如下: 下面程序的输出结果是多少? import java.util.Dat ...

  5. java中的this.getclass和super.getClass(),以及继承的深入探究

    情况一.继承.多态中的this 在继承多态中: 1.对于方法的覆盖,new的谁就调谁,这就是多态. 2.对于成员变量的覆盖,this在哪个类就指向哪个类的成员变量,没有多态. 即方法有多态性,但是成员 ...

  6. java getclass() 继承_【java】继承和super.getClass()

    一.先看问题 question:输出的结果是什么? package cn.wxy.extendsion; /** * 父类 * @author reliveIT */ public class Fat ...

  7. Java中泛型 Class<T>、T与Class<?>、 Object类和Class类、 object.getClass() 和 Object.class

    From:Java中泛型 Class<T>.T 与 Class<?>. Object类 和 Class类. object.getClass() 和 Object.class : ...

  8. getClass和getName

    getClass和getName getClass getName getClass public final Class<?> getClass() 返回此 Object 的运行时类.返 ...

  9. Java中的getClass()方法

    我们知道在Java中一切都是对象,我们一般所使用的对象都直接或间接继承自Object类.Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的类型类. 类型类指的是代表一个 ...

最新文章

  1. 编写程序实验两个数的加减结果的判断_力学实验1:实验基础与实验仪器
  2. python3下载文件-Python3学习笔记(十八):文件上传和下载
  3. 第七章、Linux 文件与目录管理
  4. python的sorted函数对字典按key排序和按value排序
  5. MySQL笔记-ibd文件格式初步分析(仅数据块笔记)
  6. 502 proxy error解决方法_老大说,网上这种获取真实IP地址的方法不对,我不信......
  7. 如何重新安装win2008服务器系统分区,怎么解决安装server2008后磁盘分区消失的方法步骤...
  8. ElastcSearch的Mapping映射建立
  9. html制作一个视频播放器,H5 打造属于自己的视频播放器(HTML 篇)
  10. android 使用系统下载并更新版本,安卓系统更新升级的种方法
  11. c语言消消乐字母游戏代码,基于pygame的小游戏———数字消消乐
  12. android 9闪屏,android 9图片制作 显示会出现闪屏怎么处理
  13. 嵌入式BootLoader技术内幕
  14. BC渗透的常见切入点(总结)
  15. Python 高德地图经纬度与地址相互解析
  16. OHA Android
  17. 【Jira数据自动化】Jira接口请求(一)
  18. 嵌入式安防监控项目——前期知识复习
  19. 时尚一族青睐手机文学 手机阅读市场初现端倪
  20. logstash之ruby模块

热门文章

  1. webpack4配置(1)-打包一个js文件
  2. 云终端要如何和服务器配置起来使用的
  3. 快速上手Spring WebFlux框架
  4. Nginx日志配置及分割
  5. MyMathLib系列(行列式计算2)
  6. 开源DataBase组件:FluentMigrator
  7. 我的第九个java程序--spring和mybatis整合(java project)
  8. git log控制输出宽度
  9. 整数的二进制表示中 1 的个数
  10. Exchange 2010 OWA更改过期密码