日期:2014-05-20  浏览次数:20693 次

Object.class
如题。
这个应该是Object的静态属性。
但是为什么Object源码中找不到呢?
还有就是每个类都有这个.class
那么是Object中继承来的吗?
但是继承不是不能继承到静态属性的吗?
Java code

public class Test03 {
    public static void main(String[] args) {
        System.out.println(B.a);;//这里提示编译错误
    }
}

class A{
    public static int a = 4;
}

class B{
    
}



那么可以说是每个类都给它定义了一个静态属性class
吗?

希望知道的帮忙解释下。不知道的、打酱油的请绕道,因为楼太高真不好找答案。

------解决方案--------------------
public B extends A{}

就可以了 ,

每一类被jvm加载时,jvm都有会有一个对应class对象与之对应 ,在方法区有他的父类信息 ,接口信息 ,类属性及类方法信息
------解决方案--------------------
效果类似,但本质上不能这么说,在Java标准定义中:class 是 “Primary Expressions”,可以考虑翻译为:原始表达式。

也就是说:它本质上是个表达式,而并非一个属性。如果你注意看Eclipse的语法色彩,也会注意到 Object.class 后面这个 class 用的是关键字的颜色。

你可能还心存疑虑,我再给你个旁证,就是你可以写: int.class 或者 byte.class
而且你会发现 int.class 跟 Integer.class 绝对不是一个东西。


当然,最权威的来说,还是你自己去看JLZ(Java Language Specification),Java语言规范:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8
章节 15.8. 就是 Primary Expressions
其中 15.8.2 就介绍了 class
------解决方案--------------------
.java文件需要编译成.class文件才会被jvm加载,每个类都有一个.class文件,不管是内部类还是其它什么类。我的理解class这个东西相当于一个KEY,通过这个KEY从jvm中找到这个.class文件,创建对象需要这玩意
------解决方案--------------------
楼主看的位置不对,不要找Object,要找Class。
Class也是一个类。
写程序,去定义一个类,那这个类的信息用什么来保存呢?就是这个class类。java中每个类都有一个相应的Class对象。即定义完一个类,编译之后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。
获取Class实例的方式之一,就是用.class的方式。
就也是说,楼主问的“每个类都有这个.class”,它的作用就是获取那个类的Class实例,这个类的Class实例记录着这个类的类型信息。
有点绕,楼主慢慢理解下吧。
------解决方案--------------------
学软件的,如果直接以E文不行,就不看原版,可不是个好习惯啊。。。

这里有中文的(上下两卷):
http://download.csdn.net/download/ticmy/3143269
http://download.csdn.net/download/ticmy/3143289

在第318页(PDF页是336),自己慢慢看吧(不过翻译的比较一般)。。。
------解决方案--------------------
每个类编译后都会有对应的.class文件,加载.class文件时会由JVM生成一个继承自Object的Class实例和一个指向该实例的引用,Class对象是属于类的,所以是静态的。

至于为什么Object中没有class属性,受ldh911的启发,class是关键字,java应该是提供了某种机制去获取JVM中的指向Class的引用。

另外,Object还有一个非静态的getClass方法,是native的,猜测也是通过调用本地方法获取JVM中的类的Class实例的引用。

------解决方案--------------------
上面描述不准确,不是JVM中,是JVM运行时数据区的方法区中。
------解决方案--------------------
嗯,对,类的类型信息存储在方法区,然后在堆中会生成一个与这些类型信息相关联的Class实例。:)
探讨

引用:

上面描述不准确,不是JVM中,是JVM运行时数据区的方法区中。


在堆中。