0

私は基本的なクラス継承の演習に取り組んできましたが、要点はわかったと思いますが、私のプログラムは本来の方法で動作していません。コンパイル エラーが発生しましたが、その理由を理解できませんでした。皆さんがここで私を助けてくれたら素晴らしいことです。

まず、3 つのファイルがあります。 1. Person.java - 基本クラス 2. Student.java - Person.java の派生クラス 3. Family.java - よくわかりませんが、独自の基本クラスだと思います

Person.java には、String name と int age の 2 つのインスタンス変数と、toString、equals、および set/get メソッドの各種コンストラクターがあります。

Student.java もまた、Person の派生クラスであり、定義上、Person 内に含まれるすべてのものと、さらに 2 つのインスタンス変数、String major、および double gpa を持ちます。このクラスには、major と gpa の get/set メソッドもあります。これは、あるクラスの生徒を別のクラスの生徒と比較する equals メソッドです。名前、年齢、専攻、gpa をすべて 1 つの文字列で返す toString のオーバーライド メソッドと呼ばれていると思います。 .

最後に、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;
}
}

学生.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;
}

}
4

2 に答える 2

0

問題は次の行にあります。

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

この時点では、ファミリはまだ初期化されておらず、null になります。addPerson メソッドを呼び出す前にファミリを初期化するには、次の 3 つのオプションがあります。

1) 作成時にファミリを初期化する

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

2) コンストラクターでファミリーを初期化する

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

3) addPerson を呼び出す前に Family のインスタンスを作成し、family 属性を初期化します (これはエラーが発生しやすく、回避する必要があります)。

于 2013-07-22T01:43:10.030 に答える