很抱歉这是一个虚假的问题,但是为什么我们甚至可以使用String
,int
和其他人,如果我们可以只使用Object作为类型?
我的意思是使用Object one;
代替String one;
答案 0 :(得分:2)
例如,String
类声明了一堆方法。如果您的变量声明为Object
,则只有Object
及其超类(无)中声明的方法在该变量上可见,而不管实际对象的类型如何。
你可以做到
String one = new String("whatever");
System.out.println(one.length());
但你做不到
Object one = new String("whatever");
System.out.println(one.length());
在变量的编译时类型上解析方法和字段。
答案 1 :(得分:1)
因为在某些情况下,如果您知道,您将拥有String
,最好使用:
String str = "foo";
int length = str.length();
而不是像这样进行类型转换:
Object str = "foo";
try {
int length = ((String)str).length();
} catch (ClassCastException e) {
// and now what?
}
不知道str
是否真的是String
!
班级Object
仅提供Object
方法。因此,您无法访问length()
上的Object
方法。
因此,每次您知道,您只能处理String
,使用 a String
!
如果您不确定自己将拥有什么,则必须使用Object
并执行特殊逻辑(类型转换,ClassCastException
上的错误处理等等。)。
答案 2 :(得分:0)
因为Object
是最低的共同点。它也不是类型安全的,每次你想要对该类进行特定的操作时,你都必须转换为特定的类型。
答案 3 :(得分:0)
真的有几个原因..
在charAt
对象上尝试使用String
,由Object
类型引用引用。如果我们仅使用Object
类型引用,那么我们只能使用Object
方法,这些方法并不完全有用。
某些方法需要 String
类型,而不是Object
类型。例如,string.substring()
需要一个或两个arguments
类型int
。如果您传递Object
,则无法编译,除非您进行投射。这意味着,每次你想要使用一些不接受类型Object
的本机Java功能,并且需要更具体的引用类型时,你必须抛出它......这在大多数情况下都是如此。
所以代码有点血腥感。使用这些类型意味着只需查看变量类型即可自动知道它将保留的数据类型。 String
会保留一些文字。 int
包含一个整数,double
包含一个大小数。这有助于使代码更具可读性,因此更具可扩展性。