我首先要说的是,如果标题太模糊/不够好我很抱歉,我很难用一行标题来表达我的问题。
我正在为我的数据结构类开发一个项目,并且我很难绕过Abstract类继承,以及如何通过子类,对象比较,方法args来操作它,等。我整夜都在阅读StackOverflow帖子/ java教程(现在差不多4个小时),虽然我学到了很多东西,但我还是不了解一些东西。我已经用2年多的时间用java编码了,并且最近一直使用C语言,所以我感觉非常生疏和不堪重负:/
项目概述
我被要求建立一个代表我的大学生和教授数据的各种数据库。我有一个抽象的超类Person
,它有2个子类Student
和Instructor
。最后(我目前正在研究的类)是一个名为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
运算符比较给了我奇怪的结果。我真的很想了解这些东西,它真的很棒,看起来非常有用。如果你希望我发布更多代码我可以,但我觉得这可能足以让我的观点得到解决。再次感谢:)
答案 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
违反了单一责任原则。你的班级应该只做一件事。为什么不选择UniversityPeople
和UniversityInstructor
?但是既然你正在遵循指示,那么这就是你明确功能的想法。在您UniveristyStudent
数组之前,在数组中获取一个内容。说null
,然后你可以Person person = array[0];
然后if (person instanceof Student)
。这样您就可以知道阵列的类型并相应地进行。