Java class、Object、Class 的区别
Java的对象模型中:
- 所有的类都是Class类的实例,Object是类,那么Object也是Class类的一个实例。
- 所有的类都最终继承自Object类,Class是类,那么Class也继承自Object。
而第2个假设是对的:java.lang.Class是java.lang.Object的派生类,前者继承自后者。
Java class、Object、Class 的区别?
按我的理解,
Class只是一个名字比较特殊的类,是关键字class修饰的类,一般应用于反射,只是名称比较特殊而已,可以通过Class类型来获取其他类型的元数据(metadata),比如字段,属性,构造器,方法等等,可以获取并调用。
class是一个关键字,是用来修饰类
Object是一个特殊的类,所有的类都继承该类,包括Class也继承Object。
类是一个语法概念,是一个抽象的概念,所有class修饰的都属于这个概念。所有类都有一个(属性,好像也不是属性)class返回含有该类元数据的Class类的实例。(有点不好描述,就是比如Class a=Test.class)。
1.所有的类都是Class类的实例,Object是类,那么Object也是Class类的一个实例。
这句话是完全混乱以及不知所云的。当然,我知道你错在哪儿,我试着给你理一下。
中文说到“类”,对应的英文是class,ok,这是一个前提,不要认为他们是不同的东西。一个class,描述的是一个抽象的数据结构,或者说,一个class,是一个抽象数据结构的定义,记住,这里说到的class,是一个语法上的概念,并没有实体跟它对应。
接下来,在JDK中,提供了两个预定义的class, Object以及Class。按照Java规范,所有的class(注意我这里对class和Class的大小写形式的区分使用,class代表的是语法概念,Class代表JDK中提供的Class数据结构)都是Object的子类,所以, Class一定是Object的子类,它用来描述所有的class的meta信息,比如它有多少个字段啊,有些什么方法啊,等等这些数据结构信息。
接下来,看实例是什么?实例是指根据抽象的class定义在运行时声明的一段内存区间,该内存区间可以按照class的定义进行合法的访问。所以,Object不是实例,Object是一个class,可以用一个Class的实例来描述。
最后这句话有点绕,回头看看你的原文,“所有的类都是Class类的实例”, 类就是类,就是class,是一个语法概念,是你自己定义的一个抽象数据结构,跟实例无关,所以,自然的,Object只是一个class,而不是Class的实例。
看下面的代码
Class cls = Object.class;
Class cls = new Class(new byte[2048]);
Object obj = cls.newInstance();
Object obj = new Object();
* 注意,第二行代码实际上是不成立的,但从逻辑上比较容易理解,所以我就生造了这样一个调用。
第一行代码中,Class是一个class, Object也是一个class,同时,Object.class指向一个Class实例,该实例可以描述Object的数据结构(实际上,就是内存布局)。
第二行代码,可以用来解释,那个Object.class又是哪儿来的,实际上,就是从硬盘上读入的class文件的二进制数据,然后通过new一个Class的实例,并传入加载的class文件的二进制数据,Class的内部实现会解释二进制数据并生成相应的内部描述数据。
第三行代码,Class的newInstance方法总是通过Class的实例才能调用的,因为如上所述,我们通过实例化一个Class的手段来得到一个类的meta描述。
第四行代码,是我们通常创建实例的手段,从逻辑上,你可以认为,第4行代码实际上就等同于第二行代码加上第三行。
最后,在实际的JVM实现中,并不这样简单,但你需要首先从逻辑上理解这些概念之间的关系,然后,自己再去深入学习。再强调一遍,我这里的描述,都只是逻辑上等价的描述,并不是实际情况。
先有Class还是先有Object?
真是一个好问题!
我大概讲一下我的想法,对不对不知道,只是想和大家交流一下。
应该是先有Object类再有Class类。
在实现Class类的时候,先继承了Object类,然后编译成.class的字节码,这样就能被JVM加载了。
虚拟机加载了所有类。这些类在虚拟机里都能被Class类进行描述,Object类也是,它的字段,方法什么的也都能被Class类进行描述和表示。而这个表示类的Class实例是由虚拟机装载类时自动构造的。
so,题主明白了吧,这里面不是谁先谁后的关系,而是他们压根不在同一个世界里。Object在Class类之前,那是在编译期;Class能表示Object类,那是在JVM中。这个跟鸡和蛋之间的关系是两码事,要分开在不同的场景里讨论。
刚看到这个问题的时候我愣了一下,好像从没思考过这个问题,不得不说题主的眼光很独到。
Java class、Object、Class 的区别的更多相关文章
- Java class,Object,Class的区别
代码: http://www.cnblogs.com/hongdada/p/6060487.html package com.company; public class Main { public s ...
- Java泛型Object和?区别
在写spark streamming读取kafka latest offset的时候,有一下语句: Map<TopicAndPartition, Object> latestOffsets ...
- java synchronized(object/this)的 区别
1.synchronized(object) package test.thread; import java.io.IOException; import org.junit.Test; /* * ...
- -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中
本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait( ...
- Java总结篇系列:java.lang.Object
从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解. Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java ...
- java中 == 与 equal 的区别
http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452156.html String str1 = new String("s ...
- java中ArrayList 、LinkList区别
转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...
- 【转】java int与integer的区别
java int与integer的区别 int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象 1 ...
- Java笔记——equals和==的区别
摔在这里几次,还是记下来吧. 原文:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452156.html -------------- ...
- java 中 ==和equals 的区别
Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolea ...
随机推荐
- 多个StoryBoard之间的跳转
iOS项目中可以将同一业务流程的页面归置到一个StoryBoard中,项目中必然会包含多个StroryBoard,可以利用跳转,实现项目的不同业务流程页面间的跳转切换. 实现思路: 1,项目(Proj ...
- Spring - Netty (整合)
写在前面 大家好,我是作者尼恩.目前和几个小伙伴一起,组织了一个高并发的实战社群[疯狂创客圈].正在开始 高并发.亿级流程的 IM 聊天程序 学习和实战,此文是: 疯狂创客圈 Java ...
- Angular学习笔记—基础(转载)
创建简单组件 新建组件 $ ng generate component simple-form --inline-template --inline-style # Or $ ng g c simpl ...
- Linux学习笔记—Linux磁盘与文件系统管理(转载)
认识EXT2文件系统 文件的系统特性 Linux的正规文件系统为Ext2 文件数据除了文件实际内容外,还包括其他属性(文件权限.文件属性). 文件系统将这两部分数据分别存放在不同的块,权限和属性放在i ...
- python删除所有的中文字符、非ASCII或非英文字符,检查字符串是否包含非ASCII
Your ''.join() expression is filtering, removing anything non-ASCII; you could use a conditional exp ...
- STL sort “invalid operator <”
跟踪了下,是比较函数(下面的_Pred)的问题: template<class _Pr, class _Ty1, class _Ty2> inline bool _Debug_lt_pre ...
- 转:用unix socket加速php-fpm、mysql、redis的连接
图虫的服务器长期是单机运行.估计除了mysql之外,php-fpm和redis还可以在单机上共存很长时间.(多说服务器早就达成了单机每日2000万+动态请求,所以我对单机搞定图虫的大流量非常乐观) 如 ...
- jQuery Mobile 手动显示ajax加载器
在jquery mobile开发中,经常需要调用ajax方法,异步获取数据,如果异步获取数据方法由于网速等等的原因,会有一个反应时间,如果能在点击按钮后数据处理期间,给一个正在加载的提示,客户体验会更 ...
- [转]如何用C#动态编译、执行代码
在开始之前,先熟悉几个类及部分属性.方法:CSharpCodeProvider.ICodeCompiler.CompilerParameters.CompilerResults.Assembly. 一 ...
- Python(面向对象编程—1)
class tst: l=[] x=1 a=tst() b=tst() a.l.append('a') b.l.append('b') a.x='a' b.x='b' print(a.l,a.x) # ...