访问引用类型为“对象”的类的数据成员

时间:2019-09-11 05:24:36

标签: java

我已经尝试通过引用'Object'类(Java中所有类的基类)访问Student类的数据成员,但是编译器会抛出编译时错误。

代码

class Student {
  String name;
  int roll;
  public Student(String name, int roll) {
    this.name = name;
    this.roll = roll;
  }
}

class Main {
  public static void main(String[] args) {
    Object ob[] = new Object[4];
    Student s = new Student("Yash", 88);
    ob[0] = s;

    System.out.println(s.name);
    System.out.println(ob[0].name);
  }
}

输出(编译时错误)

Main.java:19: error: cannot find symbol
    System.out.println(ob[0].name);
                            ^
  symbol:   variable name
  location: class Object
1 error
compiler exit status 1

实例和指针都属于同一类

System.out.println(s.getClass());
System.out.println(ob[0].getClass());

输出:

class Student
class Student

2 个答案:

答案 0 :(得分:1)

tldr;您仍然需要投射它:

System.out.println(((Student)ob[0]).name);

尝试ob[0].name时会在编译之前看到它。由于尚未编译,因此编译器尚不知道其类型为Student。但是在编译之后,运行时变量会在您调用ob[0]=s时发生变化,这就是ob[0].getclass()起作用的原因。

答案 1 :(得分:1)

可以 Object投射到Student,或者您可以使用 reflection

System.out.println(Student.class.getDeclaredField("name").get(ob[0]));

System.out.println(((Student) ob[0]).name);

或首先将其设置为Student的数组。

Student[] ob = new Student[4];
ob[0] = new Student("Yash", 88);
System.out.println(ob[0].name);