如何使用Object of Array访问子类的Instance变量?

时间:2016-11-21 09:00:28

标签: java inheritance arrayobject

我想使用对象数组'arr'来访问变量's'?请参阅代码段。

    public class Array_Chp3 {
        public static void main(String[] args) {
        Array_Chp3[] arr = new Array_Chp3[3];
        arr[0] = new str();  // when used this line instead of the below line , getting the error "s cannot be resolved or is not a field"
        //arr[0] = new Array_Chp3(); // when used this line instead of the above line, getting the error s cannot be resolved or is not a field
        str obj = new str(); 
        System.out.println(arr[0]);
        System.out.println(arr.length);
        System.out.println(arr[0].s); // How to access the variable 's'?

        }
    }
    class str extends Array_Chp3{
         public String s = "string123 @ str"; 
    }

错误讯息: 线程“main”中的异常java.lang.Error:未解决的编译问题:     s无法解决或不是字段 在Array_Chp3.main(Array_Chp3.java:17)

2 个答案:

答案 0 :(得分:1)

您的数组是Array_Chp3的数组。这意味着您确定此数组的元素是Array_Chp3的实例。你并不关心它们具体的类型,只要它们是Array_Chp3的实例。

您在第一个元素中存储的是str个实例。没关系,因为str Array_Chp3(它扩展了Array_Chp3)。

但由于数组的类型是Array_Chp3 [],编译器无法保证其元素都是str的实例。所有可以保证的是它们是Array_Chp3的实例。

你知道它是str,所以你可以告诉编译器:相信我,我知道它实际上是str。这叫做演员:

System.out.println(((str) arr[0]).s);

但它显示了一个设计问题。如果您需要元素为str的实例,则应将数组声明为str的数组。

答案 1 :(得分:0)

如果你知道它是str,你可以像这样投射:

System.out.println(((str)arr[0]).s);