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」変数を参照します。子クラスのオブジェクト参照を保持する参照は、子クラスのメンバー (関数または変数) にアクセスできなくなります。これは、親参照変数が親クラス内のフィールドにのみアクセスできるためです。したがって、参照変数のタイプによって、インスタンス化されるオブジェクトのタイプではなく、呼び出される「値」のバージョンが決まります。これは、コンパイラがメソッドに対してのみ特別な実行時ポリモーフィズム メカニズムを使用するためです。 (インスタンス化されるオブジェクトのタイプによって、呼び出されるメソッドのバージョンが決まります)。
注記: 型キャストによる親ポインタを使用して子データ メンバーにアクセスできるようになります。