我想使用对象数组'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)
答案 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);