2017-01-23 10 views
-1

タイトルがあまりにもあいまい/不十分であれば申し訳ありませんが、私は1行のタイトルで私の質問を明言していました。Java - 抽象クラスの継承とサブクラスオブジェクトの比較を理解しようとしています

私は自分のデータ構造体クラスのプロジェクトに取り組んでいます。私は抽象クラスの継承を頭に入れて、それをサブクラス、オブジェクトの比較、メソッドの引数などを使ってどのように操作することができますか。私はStackOverflowの投稿/ Javaチュートリアルを一晩中(現在はほぼ4時間)読んできましたが、私はトンを学んだが、まだ何かを理解していません。私は2年以上にJavaでコーディングしていないと私は非常に錆びた感じているので、最近は主にCを使用していると圧倒:/

プロジェクトの概要

私は種類のデータベースを構築するように頼まれた

私の大学生や教授のデータを表しています。私は抽象スーパークラスPersonを持っています。子クラスは2つの子クラスStudentInstructorです。最後に(私が現在取り組んでいるクラス)、と呼ばれるクラスで、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

1.あなたが言っているのは、**ダイナミックメソッドバインディング**です。 'Person ob = new Student();' 'ob'を使って' Person'クラスのメソッドにアクセスすると、 'Person'クラスでオーバーライドされていなければ元のメソッドが呼び出されます。 Student'、それ以外の場合は、オーバーライドされたメソッドが呼び出されます。 2. 'instanceof'は**あなたが考えていたものであれば**メソッドではありません。それは演算子です。 obが 'Student'オブジェクトの場合、' ob instanceof Student'はtrueを返します。あなたのコンパイラは警告を無視します。 – progyammer

+0

@progy_rock 1.私はかなり混乱していたので、1.の説明をありがとう。 'instanceOf'メソッドを呼び出した場合、私は誤っているかもしれません。私はお詫びします。私はそれがブール値を返す比較演算子であることを知っていました。私はそれが実装されているかどうか分からず、コンパイラは自分自身をさらに疑わせました。それは私が書いたことと比べて、そのタイプの比較をするのに好ましい方法ですか? – FuegoJohnson

+0

私が以前のコメントで示したことは、オブジェクトを比較する方法でした。あなたのコードでは、配列の基本型を比較す​​る(むしろチェックする)必要があります。あなたはそこで少し間違いを犯しただけで、よく指摘され、答えで@SME_Devによって修正されました。コンパイラの警告に関しては、プログラムに影響を与えないような警告を抑制することができます。これを見てください:[JavaのSuppressWarnings( "unchecked")とは何ですか?](http://stackoverflow.com/questions/1129795/what-is-suppresswarnings-unchecked-in-java) – progyammer

答えて

1

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

正しい長さの新しい空の配列に指定された配列を再初期化し、studentCountとinstCountに正しい数をreasigneべきです。

よろしくお願いいたします。

ネメシス。

+0

ありがとうございました。それははるかにクリーンで理解しやすいようです。ですから、私は 'Person [] array'という引数を渡すと仮定します。 – FuegoJohnson

+0

私はそれをはい、;-)参照してください。 – Nemesis

2

[...]このオブジェクトは、独自のクラスのメソッドにアクセスできますか? スーパークラスメソッドのみに制限されていますか? スーパークラスが抽象クラスである場合、この方法でインスタンス化されると、子供は引き続きメソッド を継承します。

スーパークラスがabstractであるかどうかは関係ありません。子クラスinherits親クラスのメソッドと属性。これらが子クラスによってアクセス可能かどうかは、visibility modifiersに依存します。

2つのオブジェクト配列を区別する方法がわかりません。例えば、私は、呼び出されたときに指定されたオブジェクト配列(Student []またはInstructor [])をnullに設定するclear()関数を書いています。

あなたは次のように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 
    } 
} 

実際に配列の型を比較す​​る場合は、次のようにします。

#1のために

または

array instanceof Student[] 
+0

ありがとう、私が混乱していたことのすべてをカバーしました。時には、物事を説明する特定の方法が必要になることもあります。私は決して明確な方法を過負荷にすることは考えていませんでした。私の最初の試みはあなたの最後の例を使用しました、 'if(array instanceOf Student [])'しかしコンパイラは私を怖がらせました。あなたの意見では、この場合の最良の選択肢は何ですか? – FuegoJohnson

+0

@FuegoJohnsonコンパイラの警告が表示されるコード例を追加してください。 'if(array instanceOf Student [])'はコンパイラ警告を生成せず、 'if'のスコープ内に型キャスト(' Student [] temp =(Student []) ')を実行すると、安全です。 –

1

、はい、newStudentは、それ自身のメソッドにアクセスする必要がありますし、それは@Overrideのnでない限り、またそれがスーパークラスです。

#2の場合、UniversityPeopleクラスがあまりにも多くのことをしているので、あなたは苦労しています。これはメンテナンスの問題となり、コードの匂いになります。 UniversityPeopleは、単一責任の原則に違反しています。あなたのクラスは1つのことだけを行うべきです。 UniversityInstructorUniveristyStudentを使ってみませんか?しかし、指示に従っているので、あなたの明確な機能のアイデアがここにあります。配列nullの前に、配列内の1つのコンテンツを取得します。 Person person = array[0];と言うと、if (person instanceof Student)、次にif (person instanceof Instructor)とすることができます。この方法で、配列の型を知り、それに応じて処理を進めます。

+0

私は命令がかなりばかげたIMOであることを知っています。 Javaでコーディングをしていなくても、1の代わりに2つのクラスを使用する必要があることがわかりました。これらの2つの配列を1つのクラスでゆがめなければならないという事実が私を混乱させます。あなたの提案は本当に創造的ですが、ありがとうございます。異なる視点を見るのはクールです – FuegoJohnson

関連する問題