【问题标题】:Class Inheritance in JavaJava中的类继承
【发布时间】:2013-07-22 01:26:53
【问题描述】:

我一直在做一个基本的类继承练习,尽管我认为我已经掌握了它的要点,但我的程序并没有按应有的方式工作。我遇到了编译错误并且无法弄清楚原因 - 如果你们都可以在这里帮助我,那就太好了。

首先,有三个文件 1. Person.java - 基类 2. Student.java - Person.java 的派生类 3. Family.java -不太确定,我认为它是它自己的基类

Person.java 有两个实例变量,String name 和 int age,以及一个分类 构造函数、toString、equals 和 set/get 方法

Student.java,同样,Person 的派生类,根据定义将包含 Person 中包含的所有内容,以及另外两个实例 var,String major 和 double gpa。 这个类也有major和gpa的get/set方法,一个比较一个班级学生和另一个班级学生的equals方法,我相信它被称为toString的一个覆盖方法,它在一个字符串中返回name、age、major和gpa .

最后,Family.java 是 main 方法所在的位置。它创建一个 Person 类型的数组,将“Persons”添加到该数组中,然后输出它们。

我相当确定我的 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;
}

}

【问题讨论】:

  • 您得到的确切编译错误是什么?
  • Family.main(Family.java:53) 的 Family.addPerson(Family.java:20) 的线程“main”java.lang.NullPointerException 中的异常
  • 第 20 行引用 addPerson 方法中的“if(family[i].equals(p) == true)”,第 53 行引用“f.addPerson(fred);”在 main 方法中
  • 所以是的,我的 addPerson 方法出了点问题,我也不太确定我的 Family 构造函数:/
  • 所以它们不是编译时错误,而是运行时错误。

标签: java arrays inheritance constructor


【解决方案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");
    }                       
} 

【讨论】:

  • 谢谢,你说得对,我的构造函数不完整。问题是,我仍然在 addPerson 方法中的第一个 if 语句“if(family[i].equals(p) == true”时遇到错误。你问我是否知道为什么?equals 方法不接受类吗? ?
  • 初始化后数组会有空值,需要先在数组中添加Person对象再进行比较。另外,将比较语句更改为: if(true == p.equals(family[i]))
  • @HelloMyNameIsRay 当你创建新的对象数组时,它会被nulls 填充,你不能在nulls 上调用任何非静态方法。要解决此问题,您可以测试您是否尝试使用 if (family[i] != null &amp;&amp; family[i].equals(p) == true) 在 null 上调用 equals 方法,但更好的方法是在您的 Family 类中添加计数器,使用 for (i = 0; i &lt; counter; i++) 进行迭代,以及何时添加新元素使用family[counter++] = p; 而不是family[i] = p。哦,如果计数器不会大于数组的大小,您还应该在添加之前进行测试。
  • 您还可以在if 语句之前为family[i] 添加一个空检查。
【解决方案2】:

问题出在这一行:

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

此时,family 尚未初始化,将为 null。在调用 addPerson 方法之前,您有 3 个选项来初始化家庭:

1) 在创建时初始化族

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

2) 在构造函数中初始化family

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

3) 在调用 addPerson 之前创建一个 Family 的实例并初始化 family 属性(这样容易出错,应该避免)

【讨论】:

    猜你喜欢
    • 2015-12-10
    • 1970-01-01
    • 2012-02-25
    • 2015-11-16
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    相关资源
    最近更新 更多