Java で同じデータ メンバーを持つ親クラスと子クラス

C++ では、すべてのクラス メンバー メソッドが非仮想メソッドとなります。そうするためには、プレフィックスとしてキーワードを使用する必要があります。 バーチャル 。一方、Java では、すべてのクラス メンバーのメソッドがデフォルトで仮想として設定されます。それらを非仮想化するには、キーワードを使用します。 ファイナル 。

Java の参照変数は基本的に、オブジェクトのアドレスを 16 進数で保持する変数であり、後でバイナリ システムに変換され、基本的にヒープ メモリに格納されるオブジェクトのアドレスになります。

サイズが計算できないため、プリミティブ型とは異なる参照変数。 Java では、Parent クラスの参照変数は、そのオブジェクト参照とその子オブジェクト参照を保持できます。例を使用して非メソッドメンバーについて見てみましょう。

例:

Java
   // Java Program to Demonstrate that Non-method Members   // are Accessed according to Reference Type   // (Unlike methods that are accessed according   // to the referred object)   // Class 1   // Super class   class   Parent     {      int     value     =     1000  ;      // Constructor of super class      Parent  ()      {      // Print statement      System  .  out  .  println  (  'Parent Constructor'  );      }   }   // Class 2   // Sub class   class   Child     extends     Parent     {      int     value     =     10  ;      // Constructor of sub class      Child  ()      {      // Print statement      System  .  out  .  println  (  'Child Constructor'  );      }   }   // Class 3   // Main class   class   GFG     {      // Main driver method      public     static     void     main  (  String  []     args  )      {      // Creating an object of sub class inside main()      // method      Child     obj     =     new     Child  ();      // Printing the reference of child type      System  .  out  .  println  (  'Reference of Child Type :'      +     obj  .  value  );      // Note that doing 'Parent par = new Child()'      // would produce same result      Parent     par     =     obj  ;      // Par holding obj will access the value      // variable of parent class      // Printing the reference of parent type      System  .  out  .  println  (  'Reference of Parent Type : '      +     par  .  value  );      }   }   

出力
Parent Constructor Child Constructor Reference of Child Type :10 Reference of Parent Type : 1000 

出力の説明: 親参照変数が子クラスの参照を保持しており、親クラスと子クラスの両方に「value」変数がある場合、子クラスのオブジェクト参照を保持しているかどうかに関係なく、親クラスの「value」変数を参照します。子クラスのオブジェクト参照を保持する参照は、子クラスのメンバー (関数または変数) にアクセスできなくなります。これは、親参照変数が親クラス内のフィールドにのみアクセスできるためです。したがって、参照変数のタイプによって、インスタンス化されるオブジェクトのタイプではなく、呼び出される「値」のバージョンが決まります。これは、コンパイラがメソッドに対してのみ特別な実行時ポリモーフィズム メカニズムを使用するためです。 (インスタンス化されるオブジェクトのタイプによって、呼び出されるメソッドのバージョンが決まります)。

注記: 型キャストによる親ポインタを使用して子データ メンバーにアクセスできるようになります。