Java - 试图理解Abstract类继承和子类对象比较

时间:2017-01-23 09:43:43

标签: java arrays inheritance abstract-class

我首先要说的是,如果标题太模糊/不够好我很抱歉,我很难用一行标题来表达我的问题。

我正在为我的数据结构类开发一个项目,并且我很难绕过Abstract类继承,以及如何通过子类,对象比较,方法args来操作它,等。我整夜都在阅读StackOverflow帖子/ java教程(现在差不多4个小时),虽然我学到了很多东西,但我还是不了解一些东西。我已经用2年多的时间用java编码了,并且最近一直使用C语言,所以我感觉非常生疏和不堪重负:/

项目概述

我被要求建立一个代表我的大学生和教授数据的各种数据库。我有一个抽象的超类Person,它有2个子类StudentInstructor。最后(我目前正在研究的类)是一个名为UniversityPeople的类,它引用了Student[]个对象的数组以及一个Instructor[]个对象的数组。 UniversityPeople类包含add()delete()search(),验证数据等方法。对于2个对象数组。我知道这个实现看起来很奇怪,但我不得不按照说明操作。我试图让这些方法无缝地与两个数组一起工作,这部分地让我感到困惑。我会尽力安排我的问题:

1。)这是一个普遍的问题,但我觉得对于理解继承很重要。我已经完成了很多阅读,但我仍然很困惑。如果我创建一个使用超类类型但是是子类对象的对象,例如:Person newStudent = new Student(),该对象是否可以访问其自己的类中的方法,或者它是否仅限于超类方法只?我的理解是,如果超类是abstract,孩子们在以这种方式实例化时仍会继承他们的方法。

2。)我很难理解如何区分方法中的两个对象数组。例如,我正在编写一个clear()函数,该函数在调用时将指定的对象数组(Student[]Instructor[])设置为null。我首先尝试使用instanceOf方法来测试数组的类型,但编译器警告我,我无法将类型Student转换为Person或类似的东西。这是该类的构造函数以及我遇到问题的清晰函数。我不确定我是否理解继承在这里是如何完全有效的,所以如果有更好的方法请赐教我:

构造

//Global declarations
    //Declares arrays of student and instructor classes
    private Student[] studentArray;
    private Instructor[] instArray;
    private int studentCount;
    private int instCount;

        /*
        checks user input. If user enters 1, create student array.
        if user enters 2, create Instructor array
        */
        public UniversityPeople(int type, int size)
        {
            if (type == 1)
            {
                studentArray = new Student[size];
            }
            else if (type == 2)
            {
                instArray = new Instructor[size];
            }
        }

为学生/教师分别插入方法,因为我无法找到办法1, 如果它甚至可能:

 /*
    checks if array is full or duplcate id exists.
    If not, new Student object is created and
    inserted into the student array
    */
    public void insertStudent(String lastName, String firstName, int id,
                              int age, String yearStanding, double GPA)
    {
        boolean checkFull = isFull();
        boolean checkId = containsID(studentArray, id);

        if (checkFull)
        {
            System.out.println("Array is full. Please delete a data member.");
        }
        else if (checkId)
        {
            System.out.println("Duplicate ID. Please check data and re-enter.");
        }
        if (!checkFull && !checkId)
        {
            Student newStudent = new Student(lastName, firstName, id, age, yearStanding, GPA);
            newStudent = studentArray[studentCount];
            studentCount++;
        }
        else
            System.err.println("There was an error while attempting to \n" +
                               "process your request. Please check your \n" +
                               "data entry and try again.");

    }//end insertStudent

    /*
    checks if array is full or duplicate id exists.
    If not, new Instructor object is created and
    inserted into instructor array
    */
    public void insertInstructor (String lastName, String firstName, int id,
                                  int age, int officeNum, String subjectTaught)
    {
        boolean checkFull = isFull();
        boolean checkId = containsID(instArray, id);

        if (checkFull)
        {
            System.out.println("Array is full. Please delete a data member.");
        }
        else if (checkId)
        {
            System.out.println("Duplicate ID. Please check data and re-enter.");
        }
        if (!checkFull && !checkId)
        {
            Instructor newInstructor =
                            new Instructor(lastName, firstName, id, age, officeNum, subjectTaught);
            newInstructor = instArray[instCount];
            instCount++;
        }
        else
            System.err.println("There was an error while attempting to \n" +
                               "process your request. Please check your \n" +
                               "data entry and try again.");

    }//end insertInstructor

最后,一种方法是从它们的id中找到数组中的某个人,以及清除指定数组的方法。我在大多数这些方法中都制作了arg类型Person[]数组,我希望这是可以接受的。

public int findPerson(Person[] array, int id)
    {
        for (int i = 0; i < array.length; i++)
        {
            if (array[i].getId() == id)
            {
                return i;
            }
        }

        return -1;
    }

    //Sets specified array to null. I need to reset the count of objects in
    //the specified array to 0, but i'm really confused about how that works. Below is the best
    //understanding I could come up with
    public void clear(Person[] array)
    {
        for (int i = 0; i < array.length; i++)
        {
            array[i] = null;
        }

        if (array.getClass().equals(Student.class))
        {
            studentCount = 0;
        }
        else if (array.getClass().equals(Instructor.class))
        {
            instCount = 0;
        }
        else
        {
            System.out.println("There was an issue validating the object type.");
        }
    }

我感谢任何意见或建议。我对clear()方法的实现特别感到困惑,因为我之前从未进行过这种类型的对象比较。我不确定为什么instanceOf运算符比较给了我奇怪的结果。我真的很想了解这些东西,它真的很棒,看起来非常有用。如果你希望我发布更多代码我可以,但我觉得这可能足以让我的观点得到解决。再次感谢:)

3 个答案:

答案 0 :(得分:2)

  

[...]这个对象可以访问它自己的类中的方法,或者是   它仅限于超类方法?我的理解是,如果   超类是抽象的,孩子们仍然继承他们的方法   以这种方式实例化时。

无论超类是abstract都没关系。子类inherits父类的方法和属性。子课程是否可以访问这些课程取决于visibility modifiers

  

我很难理解如何区分   方法中有两个对象数组。例如,我正在编写一个clear()函数,在调用时将指定的对象数组(Student []或Instructor [])设置为null。

您可以重载clear()方法,例如:

public void clear(Student[] array) {...}
public void clear(Instructor[] array) {...}

或(如果我理解你的例子正确的目的)将输入数组的引用与类定义中的数组引用进行比较:

public void clear(Person[] array) {
    if(array == this.studentArray) {
        // clear students
    } else if(array == this.instArray) {
        // clear instructors
    }
}

但是如果你想真正比较数组的类型,你可以这样做:

array.getClass().equals(Student[].class)

array instanceof Student[]

答案 1 :(得分:1)

对于明确的方法:

array = new Person[array.length] // re-init arrayt ot it's inital size.
studentCount = studentArrayl.length;
instCount = instArray.length;

应该将给定数组发送到一个正确长度的新空数组,并将正确的数字重新设置为studentCount和instCount。

问候。

报应。

答案 2 :(得分:1)

对于#1,是的,No input files supplied可以访问它自己的方法,也可以访问它的超类,除非它newStudent n。

对于#2,你很难,因为你的@Override课做了太多事情。这将成为一个维护问题,并且是一种代码味道。 UniversityPeople违反了单一责任原则。你的班级应该只做一件事。为什么不选择UniversityPeopleUniversityInstructor?但是既然你正在遵循指示,那么这就是你明确功能的想法。在您UniveristyStudent数组之前,在数组中获取一个内容。说null,然后你可以Person person = array[0];然后if (person instanceof Student)。这样您就可以知道阵列的类型并相应地进行。