关于getClass()的一些自己的见解
通过观看视频讲解,我得知,Class 老师讲解的是 这个是类的类,即是管理类的类.当时不是很理解,随后查询了相关资料后,以及真切的运行了几行代码后,才有一些深层次的体会, 在这里想要跟大家分享一下.如果有说的不对的地方,还欢迎老师和同学进行纠错指正.
首先,我做的就是查看源码,也就是getClass(); 的源码,下面的截图就是我查询到的源码.
Class Object 类的介绍:

接着 点击其方法,找到个体Class() ,点击进去查找源码.

通过查询源码,我得知的是 getClass();运行的结果返回的是是正在运行的实例化对象的Class.也就是说返回的是一个类,而不是一个对象,
接着,我根据我查看源码得到的结论,在代码实例中进行验证,请看下面的代码:
package concreteHandler;
import java.util.GregorianCalendar;
public class ObjectDemo {
public static void main(String[] args) {
// create a new ObjectDemo object
GregorianCalendar cal = new GregorianCalendar();
// print the class of cal
System.out.println("" + cal.getClass());
// create a new Integer
Integer i = new Integer(5);
// print the class of i
System.out.println("" + i.getClass());
}
}
代码输出的结果跟我预想的结果是一致的:
class java.util.GregorianCalendar
class java.lang.Integer
确实是返回运行实例的Class,但是我有一个新的想法,如果这个类和另一个类有着继承的关系的话,那么在运行getClass(); 后,会输出什么样的值,在我没有尝试之前,我个人猜测是会返回其父类的运行实例.于是我开始尝试代码运行,运行代码如下:
package concreteHandler;
import java.util.Date;
public class Test extends Date {
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
Test myTest=new Test();
myTest.test();
}
public void test(){
System.out.println(super.getClass().getName());//concreteHandler.Test
System.out.println(this.getClass().getName());//concreteHandler.Test
System.out.println(Test.class.getName());//concreteHandler.Test
System.out.println(Date.class.getName());//java.util.Date
System.out.println(Test.class.getClass().getName());
//java.lang.Class
//因为类.class就可以获得class了,再一个getClass()就直接到java.lang.Class
System.out.println(Date.class.getClass().getName());//java.lang.Class
System.out.println(Test.class.getClass());//class java.lang.Class
System.out.println(Date.class.getClass());//class java.lang.Class
System.out.println(Test.class);//class concreteHandler.Test
System.out.println(Date.class);//class java.util.Date
System.out.println(Test.class.getSuperclass()); //class java.util.Date
}
}
其返回值显而易见,关于super.getClass().getName()的返回值,我猜测错误,于是我又查阅了相关的博文和资料,看到有相关总结为以下三个原因,:
第一点:Test还是Dtae的getClass()都是从Object继承来的
第二点:返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
第三点:想要获得运行实例对象的父类,使用Test.class.getSuperclass()。而不能用 Test.getClass().getSuperclass().
注:Java的每个类都带有一个运行时类对象,该Class对象中保存了创建对象所需的所有信息。
可以用.class返回此 Object 的运行时类Class对象,也可以用getClass()获得。
获取Class的三种方法:
实例化对象.getClass()、类.class、Class类的静态方法 Class.forName("包名.类路径")
关于getClass()的一些自己的见解的更多相关文章
- 关getClass().getClassLoader()
InputStream is = getClass().getClassLoader().getResourceAsStream("helloworld.properties&q ...
- super.getClass()方法调用
下面程序的输出结果是多少?import java.util.Date;public class Test extends Date{public static void main(String[] a ...
- java中Class对象详解和类名.class, class.forName(), getClass()区别
一直在想.class和.getClass()的区别,思索良久,有点思绪,然后有网上搜了搜,找到了如下的一篇文章,与大家分享. 原来为就是涉及到Java的反射----- Java反射学习 所谓反射,可以 ...
- Java类名.class和getClass()区别
区别 类名.class叫做“类字面量”,因class是关键字, 所以类名.class编译时确定. getclass()运行时根据实际实例确定,getClass()是动态而且是final的. Strin ...
- super getClass()
首先看一段代码: import java.util.Date;public class Test extends Date{ public static void main(String[] args ...
- [OC笔记] Category分类之见解
用过别的语言做过开发的同学都知道,如果你想扩充一个类,就应该去继承这个类.但是OC里面有更好的方法,那就是分类. 那什么是分类呢?就是在不改变原先类,我们可以在其中添加咱们自定义的方法,这样和同事合作 ...
- Java枚举类型getClass和getDeclaringClass区别(未完待续)
Java中的枚举类型有getClass()和getDeclaringClass()两个方法,在通常情况下这两个方法返回的类型一样,在某些场景下会有不同的表现 参照 http://stackoverfl ...
- Java的super调用案例: super.getClass()返回的是子类自己
If you override a method from your superclass (or your superclass's superclass etc.), super.theMetho ...
- Java 基础【08】.class getClass () forName() 详解
类名.class是Class对象的句柄,每个被加载的类,在jvm中都会有一个Class对象与之相对应. 如果要创建新的对象,直接使用Class对象的局部class.forName就可以了,不需要用ne ...
随机推荐
- Springboot,SSM框架比较,区别
百度搜 Springboot,SSM框架区别,大多说的都是 1.springboot一个应用是一个可执行jar 2.将原有的xml配置,简化为java配置 他们说的确实没错,可是根本没有说到本质,百度 ...
- MATLAB 进行五种边缘检测
自定义函数: function []=edge_detect(image_name) a=imread(image_name); I=rgb2gray(a); BW1=edge(I,'Roberts' ...
- deemo
第一部分:结缘计算机 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢? 因为亲戚的推荐,就业前景好.个人条件的话,算一般.与其他博主相比还是有些差距的. 第二部分:在计算机系里学习 你对你 ...
- synchronized各种使用场景
synchronized属于JVM锁机制 一.使用场景 在并发量比较小的情况下访问公共资源,使用synchronized是个不错的选择,但是在并发量比较高的情况下,其性能下降很严重 二.应用场景:同步 ...
- http协议状态码解析
关键词 HTTP协议 状态码 摘要 本文列出了HTTP协议的所有的状态码,并对每个状态码的含义作了深入的解释,以便大家参考. 本文列出了HTTP协议的所有的状态码,并对每个状态码的含义作了深入的解 ...
- IOS越狱插件汉化工具
提取插件文件“*.plist"进行制作汉化文件plist文件路径查看方法:安装插件后在cydia中查看该插件页底部“文件系统内容”使用文件管理软件提取(filza;ifile.....) 如 ...
- vue添加class类名
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- 关于WeakEventManger的引用
在引用WeakEventManger时,代码里添加的命名空间是System.Windows,但项目引用的却是WindowsBase,真奇葩.
- edgedb 内部pg 数据存储的探索 (四) 源码编译
edgedb 基于python开发,同时源码重包含了好多子项目,以下进行简单的源码编译 clone 代码 需要递归处理,加上recursive,比较慢稍等 git clone --recursiv ...
- neo4j通过LOAD CSV导入结点和关系
1.neo4j默认的导入入口是:安装路径/import,所以要将csv文件放在import目录下,像下面这样: 2.导入后中文乱码: 因为neo4j是utf-8的,而CSV默认保存是ANSI的,需要用 ...