Java的对象模型中:

    1. 所有的类都是Class类的实例,Object是类,那么Object也是Class类的一个实例。
    2. 所有的类都最终继承自Object类,Class是类,那么Class也继承自Object。
这个问题中,第1个假设是错的:java.lang.Object是一个Java类,但并不是java.lang.Class的一个实例。后者只是一个用于描述Java类与接口的、用于支持反射操作的类型。这点上Java跟其它一些更纯粹的面向对象语言(例如Python和Ruby)不同。
而第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中。这个跟鸡和蛋之间的关系是两码事,要分开在不同的场景里讨论。

刚看到这个问题的时候我愣了一下,好像从没思考过这个问题,不得不说题主的眼光很独到。

 
 
class字节码加载到jvm,然后在堆内存生成一个class对象。然后对象指向字节码,你就可以通过class对象快乐的操作了。
 
 
 
 

Java class、Object、Class 的区别的更多相关文章

  1. Java class,Object,Class的区别

    代码: http://www.cnblogs.com/hongdada/p/6060487.html package com.company; public class Main { public s ...

  2. Java泛型Object和?区别

    在写spark streamming读取kafka latest offset的时候,有一下语句: Map<TopicAndPartition, Object> latestOffsets ...

  3. java synchronized(object/this)的 区别

    1.synchronized(object) package test.thread; import java.io.IOException; import org.junit.Test; /* * ...

  4. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  5. Java总结篇系列:java.lang.Object

    从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解. Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java ...

  6. java中 == 与 equal 的区别

    http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452156.html String str1 = new String("s ...

  7. java中ArrayList 、LinkList区别

    转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...

  8. 【转】java int与integer的区别

    java int与integer的区别 int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象 1 ...

  9. Java笔记——equals和==的区别

    摔在这里几次,还是记下来吧. 原文:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452156.html -------------- ...

  10. java 中 ==和equals 的区别

      Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolea ...

随机推荐

  1. Outlook自动回复功能无法使用

    Outlook2010      http://support.microsoft.com/viewkb/viewkb.aspx?contentid=2596516 Outlook2007       ...

  2. _heap_alloc_base 奔溃,奔溃原因:堆被破坏

    现象:程序崩溃的地方比较随机,之前没问题的代码, 可能直接奔溃,多线程下其他地方堆栈被破坏,引起崩溃的时间是不定,所以在其他地方随机性奔溃 检测方法:使用windows工具gflags.exe 开启 ...

  3. OpenStack Network --- introduction部分 阅读笔记

    Basic Networking 1.混杂模式(promiscuous mode):当网卡被配置为混杂模式时,它们会将所有的frame传递给操作系统,即使MAC地址不匹配. 2.交换机(switch) ...

  4. Andrew Ng机器学习编程作业:Regularized Linear Regression and Bias/Variance

    作业文件: machine-learning-ex5 1. 正则化线性回归 在本次练习的前半部分,我们将会正则化的线性回归模型来利用水库中水位的变化预测流出大坝的水量,后半部分我们对调试的学习算法进行 ...

  5. Leetcode 之 Valid Triangle Number

    611. Valid Triangle Number 1.Problem Given an array consists of non-negative integers, your task is ...

  6. python s13 day04

    1.1 all() 和 any( )   all() any()   0,None,"", [], (),{} #布尔值为0的 列举,None ,空列表,空元祖,空. print( ...

  7. Apache和Nigix

    Apache   ,   Nginx    是开源的HTTP服务器软件 HTTP服务器本质上也是一种应用程序--它通常运行在服务器之上,绑定服务器的IP地址并监听某一个tcp端口来接收并处理HTTP请 ...

  8. Excel常见操作,重复数据,去除数据关联

    Eecel对一个数据进行操作后按住右下角的十字架往下拉就可以对下面的操作进行相同 的操作,所以只需先对一个数据进行操作,再拉下来就可以了 通过公式处理的数据跟其它数据有关联 需要对这些数据进行去除它们 ...

  9. BOM对象,math对象document对象的属性和操作和 事件的基本操作

    Math对象 //该对象中的属性方法 和数学有关. abs(x) 返回数的绝对值. exp(x) 返回 e 的指数. floor(x) 对数进行下舍入. log(x) 返回数的自然对数(底为e). m ...

  10. this与super关键字总结

    Ⅰ.this 用类名定义一个变量的时候,定义的应该只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法.类里面也有一个引用来访问自己的属性和方法,这个引用就是 this 对象,它可以在类里面 ...