タイトルがあまりにもあいまい/不十分であれば申し訳ありませんが、私は1行のタイトルで私の質問を明言していました。Java - 抽象クラスの継承とサブクラスオブジェクトの比較を理解しようとしています
私は自分のデータ構造体クラスのプロジェクトに取り組んでいます。私は抽象クラスの継承を頭に入れて、それをサブクラス、オブジェクトの比較、メソッドの引数などを使ってどのように操作することができますか。私はStackOverflowの投稿/ Javaチュートリアルを一晩中(現在はほぼ4時間)読んできましたが、私はトンを学んだが、まだ何かを理解していません。私は2年以上にJavaでコーディングしていないと私は非常に錆びた感じているので、最近は主にCを使用していると圧倒:/
プロジェクトの概要を
私は種類のデータベースを構築するように頼まれた私の大学生や教授のデータを表しています。私は抽象スーパークラスPerson
を持っています。子クラスは2つの子クラスStudent
とInstructor
です。最後に(私が現在取り組んでいるクラス)、と呼ばれるクラスで、Student[]
オブジェクトの配列とInstructor[]
オブジェクトの配列を参照します。 UniversityPeople
クラスにはメソッドがあり、add()
、delete()
、search()
などのデータを検証します。 2つのオブジェクト配列の場合私はこの実装が本当に奇妙に思えるが、残念なことに指示に従わなければならない。私はメソッドが両方の配列でシームレスに動作するようにしようとしましたが、これは部分的には混乱しています。
1.)これは一般的な質問ですが、私が感じることは継承を理解することが重要です。私はこれについてたくさんの読書をしましたが、私はまだかなり混乱しています。スーパークラスの型を使用するが、サブクラスオブジェクト(Person newStudent = new Student()
など)を使用するオブジェクトを作成した場合、このオブジェクトは独自のクラス内のメソッドにアクセスできますか、スーパークラスメソッドのみに制限されますか?私の理解は、スーパークラスがabstract
である場合、子供はこのようにインスタンス化されたときでも引き続きメソッドを継承します。
2.)私は、メソッド内の2つのオブジェクト配列を区別する方法を理解するのに苦労しています。たとえば、指定されたオブジェクト配列(Student[]
またはInstructor[]
)を呼び出すときにnullに設定するclear()
関数を記述しています。私はまずinstanceOf
メソッドを使って配列の型をテストしようとしましたが、コンパイラはStudent to 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];
}
}
別々の挿入方法私はcouldnので」トンそれも可能だ場合は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型を配列にしました。これらのメソッドのほとんどは、私が受け入れられることを望みます。
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
オペレーターの比較が私に奇妙な結果を与えていたのか分かりません。私は本当にこの物を理解したいと思っています、それは本当に素晴らしいと非常に便利です。もっとコードを投稿できるようにしたいのですが、これが私の意見を理解するのには十分かもしれないと感じました。おかげで再び:)明確な方法について
1.あなたが言っているのは、**ダイナミックメソッドバインディング**です。 'Person ob = new Student();' 'ob'を使って' Person'クラスのメソッドにアクセスすると、 'Person'クラスでオーバーライドされていなければ元のメソッドが呼び出されます。 Student'、それ以外の場合は、オーバーライドされたメソッドが呼び出されます。 2. 'instanceof'は**あなたが考えていたものであれば**メソッドではありません。それは演算子です。 obが 'Student'オブジェクトの場合、' ob instanceof Student'はtrueを返します。あなたのコンパイラは警告を無視します。 – progyammer
@progy_rock 1.私はかなり混乱していたので、1.の説明をありがとう。 'instanceOf'メソッドを呼び出した場合、私は誤っているかもしれません。私はお詫びします。私はそれがブール値を返す比較演算子であることを知っていました。私はそれが実装されているかどうか分からず、コンパイラは自分自身をさらに疑わせました。それは私が書いたことと比べて、そのタイプの比較をするのに好ましい方法ですか? – FuegoJohnson
私が以前のコメントで示したことは、オブジェクトを比較する方法でした。あなたのコードでは、配列の基本型を比較する(むしろチェックする)必要があります。あなたはそこで少し間違いを犯しただけで、よく指摘され、答えで@SME_Devによって修正されました。コンパイラの警告に関しては、プログラムに影響を与えないような警告を抑制することができます。これを見てください:[JavaのSuppressWarnings( "unchecked")とは何ですか?](http://stackoverflow.com/questions/1129795/what-is-suppresswarnings-unchecked-in-java) – progyammer