在Java的类继承(Class Inheritance in Java)

2019-10-29 19:42发布

我一直工作在一个基本的类继承的运动,即使我想我已经找到了它的JIST,我的计划是不工作的方式应该。 我收到编译错误,一直无法弄清楚为什么 - 这将会是巨大的,如果大家能帮助我在这里。

所以要开始,有三个文件1. Person.java碱基类2 Student.java -a派生类Person.java 3. Family.java -not十分肯定,我认为这是自己的基类

Person.java有两个实例变量,字符串名称和INT年龄和构造函数,的toString的分类,平等相待,并设置/ get方法

Student.java,再次,派生类的人,顾名思义将包含在人的所有的东西,还有两个实例瓦尔,弦乐专业,双GPA。 这个类也有获得重大和GPA / set方法,一个相当于一个班的学生,另一个班的学生进行比较的方法,我相信这就是所谓的toString的overidden方法返回的姓名,年龄,专业,GPA都在同一个字符串。

最后,Family.java是其中的主要方法驻留。 它创建类型Person的阵列,将“人”这个阵列中,然后将它们输出。

我敢肯定我的Person.java和我Student.java是罚款(我将它们包括在最下方,以防万一),但我的问题是Family.java。 也有一些是错误的,我如何增加更多的人来阵列(addPerson的方法),但我想不出什么。


Family.java

public class Family
{
private int famSize;
private Person[] family;

public Family(int size_of_family)
{
    famSize = size_of_family;
}   
public void addPerson(Person p)
{
    boolean isPresent = false;

    int i;
    for(i = 0; i < family.length; i++)
    {

        if(family[i].equals(p) == true)
        {
            isPresent = true;
            System.out.println(p.getName() + 
            " is already present in the family");
        }                       
    }       
    if(isPresent == false)
        family[i] = p;
}
public void printOutFamily()
{
    for(int i = 0; i < family.length; i++)
    {
        System.out.println(family[i].toString());
    }
}   
public static void main(String[] args)
{
   Person fred= new Person("Fred Flintstone", 50);
   System.out.println("created " + fred);

   Person wilma = new Person("Wilma Flintstone", 48);
   Student george= new Student("George Flintstone", 21, "Politics", 3.1);
   System.out.println("created " + george);

   Student sue= new Student("Sue Flintstone", 24, "Nursing", 3.3);
   Student anotherGeorge= new Student("George Flintstone", 21, "Math", 3.4);
   Person yetAnotherGeorge= new Person("George Flintstone", 21);

   Family f = new Family(10);
   f.addPerson(fred);
   f.addPerson(wilma);
   f.addPerson(george);
   f.addPerson(sue);
   f.addPerson(anotherGeorge);
   f.addPerson(yetAnotherGeorge);

   anotherGeorge.setName("Georgie Flintstone");
   f.addPerson(anotherGeorge);

   f.printOutFamily();
}
}

Person.java

public class Person 
{
private String name;
private int age;

public Person()
{
    name = "John Smith";
    age = 1;
}

public Person(String n, int a)
{
    name = n;
    age = a;
}

public String toString()
{
    return ("Name: " + getName() + ", Age: " + age + " ");
}

public boolean equals(Person otherPerson)
{
    return (getName().equals(otherPerson.getName()) && (age == otherPerson.age));
}

public String getName() 
{
    return name;
}

public void setName(String newName)
{
    name = newName;
}

public int getAge() 
{
    return age;
}

public void setAge(int newAge)
{
    age = newAge;
}
}

Student.java

public class Student extends Person
{
private String major;
private double gpa;

public Student()
{
    super();
    major = "Undecided";
    gpa = 0.0;
}

public Student(String theName, int theAge, String theMajor, double theGpa)
{
    super(theName, theAge);
    setMajor(theMajor);
    setGpa(theGpa);
}

public String toString()
{
    return ("Name: " + getName() + ", Age: " + getAge() + ", Major: " + major + ", GPA: " + gpa);
}

public boolean equals(Student otherStudent)
{
    return (major.equals(otherStudent.major) && (gpa == otherStudent.gpa));
}

public String getMajor() 
{
    return major;
}

public void setMajor(String newMajor)
{
    major = newMajor;
}

public double getGpa() 
{
    return gpa;
}

public void setGpa(double newGpa)
{
    gpa = newGpa;
}

}

Answer 1:

您应该添加

family = new Person[famSize];

在您的Family构造函数初始化数组。 它成为了:

public Family(int size_of_family)
{
    famSize = size_of_family;
    family = new Person[famSize];
}

作为@Pshemo和@MarkM注意到,您还需要在您添加一个检查if语句,以确保family[i]不为空:

for(i = 0; i < family.length; i++)
{

    if(family[i] != null && family[i].equals(p))
    {
        isPresent = true;
        System.out.println(p.getName() + 
        " is already present in the family");
    }                       
} 


Answer 2:

问题是在这一行:

for(i = 0; i < family.length; i++)

在这一点上,家人还没有被初始化,这将是空。 你有3个选项调用addPerson的方法之前初始化家庭:

1)在创建时初始化家庭

private Person[] family = new Person[5];

2)在构造函数初始化家庭

private Person[] family = new Person[famSize];

3)建立家庭的实例,并调用addPerson的前初始化家庭属性(这是容易出错的,应该尽量避免)



文章来源: Class Inheritance in Java