当前位置: 首页 > 知识库问答 >
问题:

类的Java继承

秦建元
2023-03-14

我试图弄清楚Java中的继承和数组,并试图让这些类一起工作。我相信我已经继承下来了,但我仍在为数组部分而挣扎。

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

人java有两个实例变量,String name和int age,以及各种各样的构造函数toString、equals和set/get方法

Student.java,根据定义,派生类Person将包含Person中的所有内容,以及另外两个实例var,String main和双gpa。这个类也有用于专业和gpa的get/set方法,这是一种将一个班级的学生与另一个班级的学生进行比较的相等方法,我相信它被称为toString的覆盖方法,它在一个字符串中返回姓名、年龄、专业和gpa。

最后,Family.java是主方法所在的位置。它创建一个类型为Person的数组,向该数组添加“人员”,然后输出它们。

我收到一个错误,上面写着:“main”java。lang.ArrayIndexOutofBounds异常:8

我不明白为什么这个程序不能正常工作,如果有人能帮我解决这个问题,我将不胜感激。非常感谢。

人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;
}

}

家庭java类

public class Family
{
private int famArray = 0;
private Person[] family;

public Family(int size_of_family)
{
    famArray = size_of_family;
    family = new Person[famArray];
}   
public void addPerson(Person p)
{
    boolean isPresent = false;

    int 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");
        }                       
    }      
    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)
{
    Family f = new Family(8);
    Person fred= new Person("Fred Flintstone", 50);
    System.out.println("created " + fred);
    f.addPerson(fred);
    f.addPerson(fred);

    Student fredStudent = new Student("Fred Flintstone", 50, "Math", 3.1);
    System.out.println("created "+ fredStudent);
    f.addPerson(fredStudent);

    Person wilma = new Person("Wilma Flintstone", 48);
    f.addPerson(wilma);


    Student george= new Student("George", 21, "Politics", 3.1);
    System.out.println("created " + george);
    f.addPerson(george);

    george.setName("Georgie");
    f.addPerson(new Student("George", 21, "Politics", 3.1));



    f.addPerson(new Student("John", 18, "Geology", 2.9));
    f.addPerson(new Student("Jane", 21, "Music", 3.2));
    f.addPerson(new Student("Tarzan", 22, "Gymnastics", 4.0));
    f.addPerson(new Student("Jim", 21, "Physics", 2.5));


    System.out.println("****** family listing: ");
    f.printOutFamily();

}
}

共有2个答案

周睿范
2023-03-14

问题在于线路

family[i] = p;

这发生在一个for循环之后,该循环递增i等于数组的长度。我没有任何建议来修复它,因为我不确定您在这里试图做什么。

乌甫
2023-03-14

这里的问题,在Family#addPerson方法中:

if(isPresent == false)
    family[i] = p;

您正在将元素添加到位置i。如果未找到元素,则i值将为族。长度,因此给你一个例外。

改用int-famArray字段:

if(isPresent == false) {
    family[famArray++] = p;
}

或者以更简单的方式开始:

if(isPresent == false) {
    family[famArray] = p;
    famArray = famArray + 1;
}

作为当前问题的补充,您应该首先检查famArray元素是否等于family.length。如果它们相同,则增加数组或不允许更多元素。

你说你有同样的问题。这是因为你正在用数组的长度初始化famArray,在Family类构造函数中指出:

public Family(int size_of_family) {
    famArray = size_of_family; //here
    family = new Person[famArray];
}

将代码更改为:

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

你就完蛋了。

 类似资料:
  • 我一直在做一个基本的类继承练习,尽管我认为我已经掌握了它的jist,但我的程序并没有按应有的方式工作。我遇到了编译错误,但还没有弄清楚原因——如果你们都能在这里帮助我,那就太好了。 首先,这里有三个文件1。人java——基类2。大学生java——一个派生的Person类。java 3。家庭java——不太确定,我认为它是自己的基类 人java有两个实例变量,String name和int age,

  • 我试图写一个类(SalaryEmployee)和子类(ComissionEmployee),但我没有得到正确的工资,我不能做SE1.SetSalesMount(20000)。我哪里出了问题? 这是主要的:

  • 问题内容: 所有自定义类/对象的超类是否隐式继承?我以为Java不支持多重继承。我问的原因是,如果我已经从我的自定义类中的另一个类继承了,并且Java再次在它之上强制隐式继承,这不是多重继承吗? 另外,java.lang.class类还是所有自定义类/对象的超类吗?如果没有,如何在Java反射中获取传递的任何类的类类型,或如何在任何对象上调用isInstance? 问题答案: 一切都是对象,说您可

  • 我有一个抽象类,这个类是在她的子类中扩展的: < li >我在这个抽象类上实现了一个方法,并抽象了另一个方法 < li >实现的方法是每个子类对象都必须访问的通用方法。所以我决定在抽象类上实现它,避免在每个子类上实现相同的方法。 小例子: 我想听听你对这种实施方式的看法, 问候。

  • 1、定义类的继承 说到继承,你一定会联想到继承你老爸的家产之类的。 类的继承也是一样。 比如有一个旧类,是可以算平均数的。然后这时候有一个新类,也要用到算平均数,那么这时候我们就可以使用继承的方式。新类继承旧类,这样子新类也就有这个功能了。 通常情况下,我们叫旧类为父类,新类为子类。 首先我们来看下类的继承的基本语法: class ClassName(BaseClassName): <st

  • 在这个问题上展开一点VBA继承模式 我正在VBA中复制一个基本的继承模式,但我想了解是否有更有效和简洁的方法来实现这一点。 考虑一下这个小测试用例。 伊尼马尔。cls公司 nimal.cls:超类 Cat.cls:动物的子类 Test.bas 通过这样做,我可以: 对Cat和Dog对象调用eat()方法,并具有特定的重写行为 这似乎可行,但很麻烦:假设您需要实现许多动物子类(狗、鸟、犰狳、鸭嘴兽、