两个初始化之间有什么区别:Object x = new String(); String x = new String();

时间:2014-07-02 07:03:23

标签: java

两次初始化之间的区别是什么:

Object x = new String(); 
String x = new String();

在java中

感谢!

7 个答案:

答案 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的