Ich werde damit beginnen zu sagen, tut mir leid, wenn der Titel zu zweideutig/nicht gut genug ist, hatte ich eine schwierige Zeit meine Frage in einem einzeiligen Titel zu artikulieren .Java - Ich versuche zu verstehen, abstrakte Klasse Vererbung und Unterklasse Objektvergleich
Ich arbeite an einem Projekt für meine Datenstrukturen Klasse und ich hatte eine harte Zeit, wickelte meinen Kopf um abstrakte Klasse Vererbung und wie es durch Unterklassen, Objektvergleich, Methode args, ect manipuliert werden kann. Ich habe die ganze Nacht durch StackOverflow Posts/Java-Tutorials gelesen (fast 4 Stunden), und obwohl ich eine Tonne gelernt habe, verstehe ich immer noch einige Dinge nicht. Ich habe nicht in 2+ Jahren in Java codiert und wurden mit meist C in letzter Zeit, so dass ich das Gefühl bin sehr rostig und überwältigt:/
Projektübersicht
Ich wurde gebeten, eine Datenbank von Art zu bauen Das sind Daten für meine Studenten und Professoren. Ich habe eine abstrakte Oberklasse, Person
, die 2 Kindklassen Student
und Instructor
hat. Zu guter Letzt (die Klasse, an der ich gerade arbeite) ist eine Klasse namens UniversityPeople
, die auf ein Array von Student[]
Objekten sowie ein Array von Instructor[]
Objekten verweist. Die UniversityPeople
Klasse hat Methoden zu add()
, delete()
, search()
, validieren Daten, ect. für die 2 Objekt-Arrays. Ich weiß, diese Implementierung scheint wirklich seltsam, aber ich muss leider den Anweisungen folgen. Ich habe versucht, die Methoden mit beiden Arrays nahtlos arbeiten zu lassen, wo ich teilweise verwirrt bin. Ich werde versuchen, meine Fragen so gut wie möglich zu organisieren:
1.) Dies ist eine Art allgemeiner Frage, aber eine, die ich fühle, ist wichtig, Vererbung zu verstehen. Ich habe viel darüber gelesen, aber ich bin immer noch ziemlich verwirrt. Wenn ich ein Objekt erzeuge, das den Typ der Oberklasse verwendet, aber ein Unterklassenobjekt ist, wie zum Beispiel: Person newStudent = new Student()
, hat dieses Objekt Zugriff auf die Methoden in seiner eigenen Klasse oder ist es auf die Oberklassenmethoden beschränkt? Mein Verständnis war, wenn die Oberklasse abstract
ist, erben die Kinder immer noch ihre Methoden, wenn auf diese Weise instanziiert.
2.) Es fällt mir schwer zu verstehen, wie man die beiden Objekt-Arrays in den Methoden unterscheidet. Zum Beispiel schreibe ich eine clear()
Funktion, die das angegebene Objekt-Array (Student[]
oder Instructor[]
) auf null setzt, wenn sie aufgerufen wird. Ich versuchte zuerst, die Methode instanceOf
zu verwenden, um zu testen, welcher Typ das Array war, aber der Compiler warnte mich, dass ich den Typ "Student to Person" oder so etwas nicht schreiben konnte. Hier ist der Konstruktor für die Klasse sowie die klare Funktion, mit der ich Probleme habe. Ich bin nicht sicher, ob ich verstehe, wie die Vererbung voll hier arbeitet, also wenn es ein besserer Weg, bitte erleuchte mich:
Constructor:
//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];
}
}
separate Einsatz Methoden für Schüler/Lehrer, weil ich couldn‘ t Abbildung einen Ausweg zu 1 zu tun, wenn es überhaupt möglich ist:
/*
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
schließlich ein Verfahren jemand in der Anordnung von ihrer ID zu finden und ein Verfahren zu klären, was Array angegeben ist. Ich habe den Arg-Typ Person[]
Array in den meisten dieser Methoden gemacht, die ich hoffe, ist akzeptabel.
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.");
}
}
Ich freue mich über jede Eingabe oder Beratung.Ich bin besonders verwirrt über die Implementierung der clear()
-Methode, da ich noch nie zuvor einen solchen Objektvergleich durchführen musste. Ich bin mir nicht sicher, warum der instanceOf
Operator Vergleich mir seltsame Ergebnisse gab. Ich würde wirklich gerne dieses Zeug verstehen, es ist wirklich großartig und scheint sehr nützlich zu sein. Wenn Sie möchten, dass ich mehr Code poste, kann ich das, aber ich hatte das Gefühl, dass das wahrscheinlich gut genug war, um meinen Standpunkt klar zu machen. Thanks again :)
1. Worüber Sie sprechen, heißt ** Dynamic Method binding **. Was passiert, wenn Sie ein Objekt wie folgt deklarieren: 'Person ob = new Student();' Wenn Sie nun 'ob' verwenden, um auf eine Methode der' Person' Klasse zuzugreifen, wird die ursprüngliche Methode aufgerufen, wenn sie nicht in 'überschrieben wird Schüler 'sonst wird die überschriebene Methode aufgerufen. 2. "instanceof" ist ** NOT ** eine Methode, wenn Sie daran gedacht haben. Es ist ein Operator. Wenn ob ein 'Student'-Objekt ist, dann wird 'ob instanceof Student' wahr zurückgegeben. NUR IGNORE IHRE COMPILER WARNUNG. – progyammer
@progy_rock Danke für die Klarstellung von 1.) da es mich ziemlich durcheinander gebracht hat. Ich habe vielleicht falsch verstanden, wenn ich 'instanceOf' eine Methode genannt habe, entschuldige ich mich. Ich wusste, dass es ein Vergleichsoperator ist, der einen booleschen Wert zurückgibt, ich war mir seiner Implementierung nicht sicher, und mein Compiler hat mich dazu gebracht, weitere Zweifel zu haben. Ist das der bevorzugte Weg, diese Art von Vergleich zu machen, was ich geschrieben habe? – FuegoJohnson
Was ich in meinem vorherigen Kommentar gezeigt habe, war die Art, Objekte zu vergleichen. In Ihrem Code möchten Sie den Basistyp des Arrays vergleichen (eher überprüfen). Du hast dort gerade einen kleinen Fehler gemacht, der von @SME_Dev in der Antwort deutlich herausgestellt und korrigiert wurde. Was die Compiler-Warnungen betrifft, können Sie einfach solche Warnungen unterdrücken, die Ihr Programm nicht beeinflussen. Siehe hierzu: [Was ist SuppressWarnings ("unchecked") in Java?] (Http://stackoverflow.com/questions/1129795/what-is-suppresswarnings-unched-in-java) – progyammer