字符串数组引用如何存储在对象数组的引用变量中?

时间:2020-05-25 04:54:47

标签: java arrays type-conversion typecasting-operator

请查看下面的代码。

class Use
{

    public static void main(String[] args)
    {
        String[] result = new String[2];//{"Hello", "World"}; // compiles and run
        Object[] name = result; // compiles and run
    //  result = name; //CE
        System.out.println(result);
        System.out.println(name);
    }
}

我的理解是Java中的数组是独立的对象,没有父子关系。因此,根据我的说法,“结果”和“名称”是两种完全不同类型的对象(即String []和Object [])的引用变量,它们没有任何关系。然后

  1. 为什么语句“ Object [] name = result;”中没有错误?
  2. 为什么“ result = name;”语句中有错误?
  3. 我知道“对象”和“字符串”具有父子关系。 “ Object []”和“ String []”之间有任何关系吗?

3 个答案:

答案 0 :(得分:0)

result = name试图将Object数组分配给String数组。您不能将Object分配给声明为String的变量,数组也是如此。您不能将数组分配给声明为其他类型的数组的变量。

Object[] name = result是合法的,因为所有对象都继承自Object类,包括String。如果您要分配的变量继承或实现了您要分配给变量的数据类型,则可以为声明的变量分配不同的数据类型。

要获得更好的理解,请阅读Java语言的文档。这是查看不同类之间关系的好资源。

对象类文档:https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html

字符串类文档:https://docs.oracle.com/javase/7/docs/api/java/lang/String.html

整数类文档:https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html

答案 1 :(得分:0)

java.lang.Object类是所有Java类的超级基类。我猜这可以解决您的困惑。 (如果B扩展为C,则表示B是C,而不是C是B。)

result = name;抛出编译错误,因为它们属于不同类型。您需要对其进行转换,以避免编译错误。

result = (String[]) name;

如果是另外一种方法,则name=result可以将String []分配给Object [];不是其他方式。

https://javapapers.com/java/why-object-is-super-class-in-java/

答案 2 :(得分:0)

如何将String数组引用存储在Object数组的引用变量中?

我知道“对象”和“字符串”具有父子关系。 “ Object []”和“ String []”之间有任何关系吗?

根据JLS Section 4.10.3. Subtyping among Array Types String[]Object[],因为StringObject,因此Object[] name = result;是合法的。

为什么“ result = name;”语句中有错误?

鉴于上述情况,Object[]不是不是 String[],这就是为什么在编译时会收到此错误的原因。

Error:(13, 26) java: incompatible types: java.lang.Object[] cannot be converted to java.lang.String[]

(毕竟,对象Object[]的数组可以包含任何引用类型的元素,例如StringInteger等)

但是,根据您的代码“您知道”,实际上这个Object[] name数组仅包含Strings。因此Object[] name实际上是String[]。因此,您可以通过显式使用向下转换(即result = (String[]) name)来使其正常工作。

通过使用向下转换,您可以向编译器明确指出此类型转换很好(因为通常不会)。然后您应该这样做违反代码中的“您的承诺”吗?

String[] strings = {"Hello", "World"};
Object[] objects = strings;
objects[0] = 1; // let's replace the string with an integer
strings = (String[]) objects;

您将在运行时收到此异常。

Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer