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 ...
随机推荐
- Powered by Flink
Apache Flink: Powered by Flink https://flink.apache.org/poweredby.html Powered by Flink Apache Flink ...
- SpringMVC 返回的 json 中去除某些不必要的属性
修改返回的Model,在对应的属性的get方法上使用 com.fasterxml.jackson.annotation.JsonIgnore 注解即可. 如 @JsonIgnore(true) pub ...
- 修改hosts文件不起作用
今天遇到个很奇怪的问题,在hosts文件里添加了一些域名指向后,发现根本没起作用,后来还发现个细节,就是hosts文件左下角有个小锁的标志,开始以为是杀毒软件之类的把他锁了.可是没找到在哪里有相关操作 ...
- 我的Android进阶之旅------>Android颜色值(#AARRGGBB)透明度百分比和十六进制对应关系以及计算方法
我的Android进阶之旅-->Android颜色值(RGB)所支持的四种常见形式 透明度百分比和十六进制对应关系表格 透明度 十六进制 100% FF 99% FC 98% FA 97% F7 ...
- nginx_cdn配置
upstream backend { server 1.1.1.1; keepalive 128; } proxy_temp_path /dev/shm; proxy_cache_path /data ...
- go——字典
Go中字典类型是散列表(hash table)的一个实现,其官方称谓是map.散列表是一个实现了关联数组的数据结构,关联数组是用于表示键值对的无序集合的一种抽象数据类型.Go中称键值对为键-元素对,它 ...
- 美国评出2016最值得去的旅游胜地+纯电动车郊游记+DIY一个小电动车
美国评出2016最值得去的旅游胜地(10) http://bbs.miercn.com/bd/201510/thread_569397_1_10.html 自带发电机! 北汽E150 EV纯电动车郊游 ...
- LeetCode:逆波兰表达式求值【150】
LeetCode:逆波兰表达式求值[150] 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除 ...
- python约束 与MD5加密写法
python 中约束写法有两种 1 常用的通过继承关系主动抛出异常 2 通过抽象类+抽象方法 1 常用的通过继承关系主动抛出异常写法 在本send方法中报错不会抛出异常, class BaseMes ...
- Spring Web MVC 随笔
1.ContextLoaderListener 对于使用Spring的Web应用,无需手动创建Spring容器,而是通过配置文件声明式地创建Spring容器.可以直接在web.xml文件中配置创建Sp ...