两次初始化之间的区别是什么:
Object x = new String();
String x = new String();
在java中
感谢!
答案 0 :(得分:5)
Object x = new String(); // pointing to a String and saying - Hey, Look there! Its an Object
String x = new String();// pointing to a String and saying - Hey, Look there! Its a String
更重要的是: 可以访问的String方法取决于引用。例如:
public static void main(String[] args) {
Object o = new String();
String s = new String();
o.split("\\."); // compile time error
s.split("\\."); // works fine
}
答案 1 :(得分:5)
初始化没有区别,仅在声明中,因此代码的其余部分看到变量类型的方式。
答案 2 :(得分:2)
不同之处在于,第一个选项x
将被编译器视为Object,而在第二个选项中,它将被视为String。例如:
public static void main (String[] args) throws Exception {
Object x = new String();
test(x);
String y = new String();
test(y);
// and you can also "trick" the compiler by doing
test((String)x);
test((Object)y);
}
public static void test(String s) {
System.out.println("in string");
}
public static void test(Object o) {
System.out.println("in object");
}
将打印:
in object
in string
in string
in object
答案 3 :(得分:2)
Object x = new String();
此处,x
只能访问Object
的方法和成员。
(要使用String
成员,您必须将x
类型转换为String
(使用Downcasting in Java))
String x = new String();
此处,x
可以访问Object
以及String
的所有方法和成员。
答案 4 :(得分:1)
两者都相同,X将引用字符串对象。
但Object x = new String();
中的x变量需要在使用x.toString()
之前使用(String)x
或{{1}}进行字符串输入。
答案 5 :(得分:0)
正如其他回答者所指出的,两种情况都会导致变量x持有对String的引用。唯一的区别是后续代码将如何看待引用:作为Object vs String,即确定编译器将允许哪些操作引用。
本质上,问题突出了静态类型语言(例如Java)和动态类型语言(例如Python,Javascript等)之间的区别。在后者中,您不必声明引用的类型,因此代码就像:
var x = new String();
在这种情况下,编译器会在运行时处推断出类型,但在编译时会丢失一些静态类型检查。
在日常Java代码中,您将始终使用以下格式:
String x = new String();
因为这样可以让你像对待字符串一样处理x并调用,例如方法toUpperCase()
就可以了。如果x是Object
,则编译器不允许您调用该方法,只允许调用Object方法,例如equals()
。
然而,在下列情况下恰恰相反:
List list = new ArrayList();
ArrayList list = new ArrayList();
除非您特别想使用ArrayList公开的方法(不太可能),否则最好将list
声明为List
,而不是ArrayList
,因为这样可以让您更改稍后实现到另一种类型的List,而不更改调用代码。
答案 6 :(得分:0)
差异是你需要投入很多 但是,您可以使用相同的变量并使用其他类型重新初始化它。当您使用更改变量时,它非常有用。
示例:
Object x = new String();
if(x instanceof String){
System.out.println("String");
}
x = new ArrayList<String>();
if(x instanceof ArrayList){
System.out.println("ArrayList");
}
返回:
的字符串 ArrayList的