两者之间有什么区别。
public class Test {
public static void main(String args[]) {
String toBeCast = "cast this string";
A a = toBeCast; // error - Type mismatch: cannot convert from String to A
Object object = toBeCast;
}
}
public class A {
}
当我们说每个对象都扩展Object class
,为什么不允许A a = toBeCast;
,但这Object object = toBeCast;
工作正常。
记住几何课上的那句老话——"每个正方形都是一个矩形,但不是每个矩形都是正方形"。将其推广为:"每个正方形/平行四边形/菱形都是多边形,但不是每个多边形都是正方形/平行四边形/菱形"。
以下是您正在做的事情:
String toBeCast = "cast this string" //this rhombus is a rhombus: cool!
A a = toBeCast; //this parallelogram is that rhombus : WTF? that doesn't make sense!
Object object = toBeCast; //this polygon is that rhombus: cool!
OBJECT
/
A String
这就是类层次结构的外观,这就是转换为 Object A
会出错的原因。
变量 toBeCast 是字符串结构的一个实例。变量 a 是类 A 的实例。
可以编译以下内容:
String toBeCast = "cast this string";
Object obj = toBeCast;
这是因为,正如您所说,对象的每个实例(包括字符串)都继承自 System.Object,但以下内容将无法编译:
A a = toBeCast;
虽然 a(类型 A)继承自 System.Object,toBeCast(类型字符串)继承自 Object,但类型 A 不继承自 Type String。
因此,编译器返回:"类型不匹配:无法从字符串转换为 A"。
因为String
不是A
的子类
查看对象窗口和对象螺钉。它们都是对象,但它们更像是一个对象。还有更多规格来描述两者,因此您知道什么是窗户或螺钉。在编码语言Java中的对象中也是如此。从完全不同的环境中转换类是没有意义的。
字符串也是 Final 并且是不可变的对象。请看一下为什么字符串在 Java 中是最终的?