java.lang.Class和java.lang.Object

时间:2014-07-13 02:18:07

标签: java multiple-inheritance

Ok概念上的困难 - 从书中阅读和学习Java

它提到了以下内容(在解释几个不同主题的过程中) -

  1. Java不支持类层次结构中的多重继承。因此,如果C类是A类的子类,那么它也不能是B类的子类(我知道接口有一个解决方案可以在这里提供)

  2. java.lang.Object是所有类(系统和用户)'扩展'的原始类。因此,每个班级都是班级java.lang.Object

  3. 的直接或间接孩子
  4. Java中的类不仅仅是编译器伪像 - 但在运行时,由类java.lang.Class的实例表示

  5. 不是#3意味着语言中定义的类本身是java.lang.Class类型 - 而#2意味着它们也是类型java.lang.Object - 与#1相矛盾?喜欢哪个类是java类的子类?

    如果#1仍然存在,我猜这意味着#3只是说类的“运行时表示”是类java.lang.Class的实例 - 这是java.lang.Object的孩子??但是这些类本身就是java.lang.Object ??

    的子代

    感谢您的指导!!提前谢谢!

3 个答案:

答案 0 :(得分:2)

  

不是#3意味着语言中定义的类本身是java.lang.Class

类型

没有。 (Class) testclass是语法错误 - 没有类是java.lang.Class的子类 - 它是final

Class扩展Object并代表class

假设我TestClass默认扩展Object,现在TestClass.class(TestClass).getClass()存在 - 他们返回Class<TestClass>,扩展Object并且是Class的实例。

But if you look into the Java documentation for Class, you'll see they are more than Objects.

答案 1 :(得分:2)

  

3)Java中的类不仅仅是编译器工件 - 但在运行时,由java.lang.Class类的实例表示

这是正确的。

  

不是#3意味着语言本身定义的类是java.lang.Class类型

这是正确的。

  

而#2表示它们的类型也是java.lang.Object

这是正确的。

  

......与#1相矛盾?

这是不正确的。没有矛盾。

“扩展”关系仅在类之间以及在运行时表示类的Class对象之间定义。如果您查看java.lang.Class API,您会看到Class getSuperclass()isAssignableFrom(Class)等方法......虽然isAssignableFrom正在测试“子类型”关系。请注意,这些方法将另一个Class作为参数,或返回另一个Class。

类和实例之间没有“继承”或“扩展”关系。并且运行时对象之间也没有这种关系。 java.lang.Class扩展java.lang.Object的事实与此无关。


  

如果#1仍然存在,我猜这意味着#3只是说类的“运行时表示”是类java.lang.Class的实例 - 它是java.lang.Object的子类?

这是正确的。

  

....但是类本身是java.lang.Object的孩子吗?

这也是正确的。

但值得注意的是,这两个属性并不直接相互关联。 (类似)巧合的是,类和表示类的运行时类之间存在类似的关系。

答案 2 :(得分:1)

  

3)Java中的类不仅仅是编译器工件 - 但在运行时,由java.lang.Class类的实例表示

这不正确。 Java对象是对象。它们还有一个表示类类型的属性

public class Test  {
   public static final void main(String[] ignored)  {
      String s = "x";
      Class cls = s.getClass();
      System.out.println("s=" + s.toString());
      System.out.println("cls=" + cls.toString());  
   }
}

输出:

s=x
cls=class java.lang.String

我们说&#34; Java对象是类&#34;令人困惑。这些在一般意义上都是正确的,但是使用这个特定的技术细节,它是不准确的。

简而言之,Java对象存储在*.class个文件中,这使得这种区分变得混乱。