如何从父类访问子变量?

时间:2014-12-13 10:57:40

标签: java inheritance

我有3个班,人,学生和老师。学生和老师扩展人。如何从Person中访问实例变量?就像学生和教师都有一个内部名称列表一样,如何从父类中访问这两个名称数组?

class Person
{
   private String name;
   public void setName(String name) {
       this.name = name;
   }
   public String getName() {
        return this.name;
   }
    public void printAllNames() { //<-- How do you do this?
        for(Student s : students) //can't access students array
           System.out.println(s.getName());
        for(Teacher t : teachers)
           System.out.println(t.getName());
    }
}

class Student extends Person
{
   protected Student[] students;
   Student(String name)
   {
      this.name = name;
      students[students.length] = this;
   }
}

class Teacher extends Person
{
   protected Teacher[] teachers;
   Teacher(String name)
   {
      this.name = name;
      teacher[teachers.length] = this;
   }
}

3 个答案:

答案 0 :(得分:1)

您的班级设计不正确。您的Student课程不应包含字段students,因为其他学生不属于Student实例(即此处不应使用作文)。相反,如果需要,您应该在这些课程之外创建学生列表。当然,教师也一样。

学生可以拥有一个朋友列表,但这样的关系也可以更好地存储在课程本身之外。朋友列表不是 学生的一部分。需要成为学生的一部分取决于您要模拟的内容(如果有助于为管理目的定义学生,则地址可能是学生的一部分)。

如果您想要访问更高级别课程的字段,您可以从Student向下转发Person,但同样,这通常会被视为设计问题的技术解决方案。

答案 1 :(得分:1)

如其他人所提到的那样忽略设计和使用数组的问题,如果你想根据它是学生和教师打印名称,你应该使printAllNames成为抽象的,并让后代类提供他们自己的打印实现。基类不应该知道子类中属性或方法的细节。

class Person
{
    ...

    public abstract void printAllNames();
}


class Student extends Person
{
    ...

    public void printAllNames() {
        for (Student s : students)
            System.out.println(s.getName());
    }
}

class Teacher extends Person
{
    ...

    public void printAllNames() {
        for (Teacher t : teachers)
            System.out.println(t.getName());
    }
}

答案 2 :(得分:0)

您的代码在 array.length()中存在问题,因为没有任何方法,例如 length()。你可以通过 array.length 访问它。

第二个学生类中没有名称变量,并且您在名称中将名称作为私有字段类别更改为公开受保护

第三,你可以在方法中传递参数,如

public void printAllNames(Student[] students, Teacher[] teachers)

并检查一次。