Ok概念上的困难 - 从书中阅读和学习Java
它提到了以下内容(在解释几个不同主题的过程中) -
Java不支持类层次结构中的多重继承。因此,如果C类是A类的子类,那么它也不能是B类的子类(我知道接口有一个解决方案可以在这里提供)
java.lang.Object
是所有类(系统和用户)'扩展'的原始类。因此,每个班级都是班级java.lang.Object
Java中的类不仅仅是编译器伪像 - 但在运行时,由类java.lang.Class
的实例表示
不是#3意味着语言中定义的类本身是java.lang.Class
类型 - 而#2意味着它们也是类型java.lang.Object
- 与#1相矛盾?喜欢哪个类是java类的子类?
如果#1仍然存在,我猜这意味着#3只是说类的“运行时表示”是类java.lang.Class
的实例 - 这是java.lang.Object
的孩子??但是这些类本身就是java.lang.Object
??
感谢您的指导!!提前谢谢!
答案 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 Object
s.
答案 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
个文件中,这使得这种区分变得混乱。