我有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;
}
}
答案 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)
并检查一次。