Learning site for website creation

クラス継承時のフィールドとメソッドの挙動

公開日:2019年09月17日

ファイル名:Sample3_1.java

class Car {
  String name1;
  String name2;
  String name3;
  String name4;
  String name5;
  String name6;

  void displayName1() {
    System.out.println(" this.name1:" + this.name1);
    System.out.println(" this.name2:" + this.name2);
    System.out.println(" this.name3:" + this.name3);
    System.out.println(" this.name4:" + this.name4);
    System.out.println(" this.name5:" + this.name5);
    System.out.println(" this.name6:" + this.name6);
  }

  void displayName2() {
    System.out.println(" this.name1:" + this.name1);
    System.out.println(" this.name2:" + this.name2);
    System.out.println(" this.name3:" + this.name3);
    System.out.println(" this.name4:" + this.name4);
    System.out.println(" this.name5:" + this.name5);
    System.out.println(" this.name6:" + this.name6);
  }

  void setName3(String name) {
    this.name3 = name;
  }

  void setName4(String name) {
    this.name4 = name;
  }

  void setName5(String name) {
    this.name5 = name;
  }

  void setName6(String name) {
    this.name6 = name;
  }
}

class CustomCar extends Car {
  String name1;
  String name3;
  String name5;

  void displayName1() {
    System.out.println(" this.name1:" + this.name1);
    System.out.println(" this.name2:" + this.name2);
    System.out.println(" this.name3:" + this.name3);
    System.out.println(" this.name4:" + this.name4);
    System.out.println(" this.name5:" + this.name5);
    System.out.println(" this.name6:" + this.name6);
  }

  void setName3(String name) {
    this.name3 = name;
  }

  void setName4(String name) {
    this.name4 = name;
  }
}

class Sample3_1 {
  public static void main(String[] args) {

    Car car1 = new Car();
    System.out.println("--------------");
    System.out.println("Car car1 = new Car();");

    car1.name1 = "車1";
    car1.name2 = "車2";
    car1.setName3("車3");
    car1.setName4("車4");
    car1.setName5("車5");
    car1.setName6("車6");

    System.out.println("name1:フィールド代入 サブクラスにフィールドあり");
    System.out.println("name2:フィールド代入 サブクラスにフィールドなし");
    System.out.println("name3:メソッド代入(サブクラスにメソッドあり) サブクラスにフィールドあり");
    System.out.println("name4:メソッド代入(サブクラスにメソッドあり) サブクラスにフィールドなし");
    System.out.println("name5:メソッド代入(サブクラスにメソッドなし) サブクラスにフィールドあり");
    System.out.println("name6:メソッド代入(サブクラスにメソッドなし) サブクラスにフィールドなし");
    System.out.println("フィールドを参照して出力");
    System.out.println(" car1.name1:" + car1.name1);
    System.out.println(" car1.name2:" + car1.name2);
    System.out.println(" car1.name3:" + car1.name3);
    System.out.println(" car1.name4:" + car1.name4);
    System.out.println(" car1.name5:" + car1.name5);
    System.out.println(" car1.name6:" + car1.name6);
    System.out.println("メソッドを呼び出して出力(サブクラスにメソッドあり)");
    car1.displayName1();
    System.out.println("メソッドを呼び出して出力(サブクラスにメソッドなし)");
    car1.displayName2();
    System.out.println();

    Car car2 = new CustomCar();
    System.out.println("--------------");
    System.out.println("Car car2 = new CustomCar();");

    car2.name1 = "車1(カスタム機能未開放)";
    car2.name2 = "車2(カスタム機能未開放)";
    car2.setName3("車3(カスタム機能未開放)");
    car2.setName4("車4(カスタム機能未開放)");
    car2.setName5("車5(カスタム機能未開放)");
    car2.setName6("車6(カスタム機能未開放)");

    System.out.println("name1:フィールド代入 サブクラスにフィールドあり");
    System.out.println("name2:フィールド代入 サブクラスにフィールドなし");
    System.out.println("name3:メソッド代入(サブクラスにメソッドあり) サブクラスにフィールドあり");
    System.out.println("name4:メソッド代入(サブクラスにメソッドあり) サブクラスにフィールドなし");
    System.out.println("name5:メソッド代入(サブクラスにメソッドなし) サブクラスにフィールドあり");
    System.out.println("name6:メソッド代入(サブクラスにメソッドなし) サブクラスにフィールドなし");
    System.out.println("フィールドを参照して出力");
    System.out.println(" car2.name1:" + car2.name1);
    System.out.println(" car2.name2:" + car2.name2);
    System.out.println(" car2.name3:" + car2.name3);
    System.out.println(" car2.name4:" + car2.name4);
    System.out.println(" car2.name5:" + car2.name5);
    System.out.println(" car2.name6:" + car2.name6);
    System.out.println("メソッドを呼び出して出力(サブクラスにメソッドあり)");
    car2.displayName1();
    System.out.println("メソッドを呼び出して出力(サブクラスにメソッドなし)");
    car2.displayName2();
    System.out.println();

    CustomCar car3 = new CustomCar();
    System.out.println("--------------");
    System.out.println("CustomCarCar car3 = new CustomCar();");

    car3.name1 = "カスタム車1";
    car3.name2 = "カスタム車2";
    car3.setName3("カスタム車3");
    car3.setName4("カスタム車4");
    car3.setName5("カスタム車5");
    car3.setName6("カスタム車6");

    System.out.println("name1:フィールド代入 サブクラスにフィールドあり");
    System.out.println("name2:フィールド代入 サブクラスにフィールドなし");
    System.out.println("name3:メソッド代入(サブクラスにメソッドあり) サブクラスにフィールドあり");
    System.out.println("name4:メソッド代入(サブクラスにメソッドあり) サブクラスにフィールドなし");
    System.out.println("name5:メソッド代入(サブクラスにメソッドなし) サブクラスにフィールドあり");
    System.out.println("name6:メソッド代入(サブクラスにメソッドなし) サブクラスにフィールドなし");
    System.out.println("フィールドを参照して出力");
    System.out.println(" car3.name1:" + car3.name1);
    System.out.println(" car3.name2:" + car3.name2);
    System.out.println(" car3.name3:" + car3.name3);
    System.out.println(" car3.name4:" + car3.name4);
    System.out.println(" car3.name5:" + car3.name5);
    System.out.println(" car3.name6:" + car3.name6);
    System.out.println("メソッドを呼び出して出力(サブクラスにメソッドあり)");
    car3.displayName1();
    System.out.println("メソッドを呼び出して出力(サブクラスにメソッドなし)");
    car3.displayName2();
    System.out.println();
  }
}

コマンドプロンプトで実行結果確認

c:\java\test>java Sample3_1
--------------
Car car1 = new Car();
name1:フィールド代入 サブクラスにフィールドあり
name2:フィールド代入 サブクラスにフィールドなし
name3:メソッド代入(サブクラスにメソッドあり) サブクラスにフィールドあり
name4:メソッド代入(サブクラスにメソッドあり) サブクラスにフィールドなし
name5:メソッド代入(サブクラスにメソッドなし) サブクラスにフィールドあり
name6:メソッド代入(サブクラスにメソッドなし) サブクラスにフィールドなし
フィールドを参照して出力
 car1.name1:車1
 car1.name2:車2
 car1.name3:車3
 car1.name4:車4
 car1.name5:車5
 car1.name6:車6
メソッドを呼び出して出力(サブクラスにメソッドあり)
 this.name1:車1
 this.name2:車2
 this.name3:車3
 this.name4:車4
 this.name5:車5
 this.name6:車6
メソッドを呼び出して出力(サブクラスにメソッドなし)
 this.name1:車1
 this.name2:車2
 this.name3:車3
 this.name4:車4
 this.name5:車5
 this.name6:車6

--------------
Car car2 = new CustomCar();
name1:フィールド代入 サブクラスにフィールドあり
name2:フィールド代入 サブクラスにフィールドなし
name3:メソッド代入(サブクラスにメソッドあり) サブクラスにフィールドあり
name4:メソッド代入(サブクラスにメソッドあり) サブクラスにフィールドなし
name5:メソッド代入(サブクラスにメソッドなし) サブクラスにフィールドあり
name6:メソッド代入(サブクラスにメソッドなし) サブクラスにフィールドなし
フィールド
 car2.name1:車1(カスタム機能未開放)
 car2.name2:車2(カスタム機能未開放)
 car2.name3:null
 car2.name4:車4(カスタム機能未開放)
 car2.name5:車5(カスタム機能未開放)
 car2.name6:車6(カスタム機能未開放)
メソッドを呼び出して出力(サブクラスにメソッドあり)
 this.name1:null
 this.name2:車2(カスタム機能未開放)
 this.name3:車3(カスタム機能未開放)
 this.name4:車4(カスタム機能未開放)
 this.name5:null
 this.name6:車6(カスタム機能未開放)
メソッドを呼び出して出力(サブクラスにメソッドなし)
 this.name1:車1(カスタム機能未開放)
 this.name2:車2(カスタム機能未開放)
 this.name3:null
 this.name4:車4(カスタム機能未開放)
 this.name5:車5(カスタム機能未開放)
 this.name6:車6(カスタム機能未開放)

--------------
CustomCarCar car3 = new CustomCar();
name1:フィールド代入 サブクラスにフィールドあり
name2:フィールド代入 サブクラスにフィールドなし
name3:メソッド代入(サブクラスにメソッドあり) サブクラスにフィールドあり
name4:メソッド代入(サブクラスにメソッドあり) サブクラスにフィールドなし
name5:メソッド代入(サブクラスにメソッドなし) サブクラスにフィールドあり
name6:メソッド代入(サブクラスにメソッドなし) サブクラスにフィールドなし
フィールド
 car3.name1:カスタム車1
 car3.name2:カスタム車2
 car3.name3:カスタム車3
 car3.name4:カスタム車4
 car3.name5:null
 car3.name6:カスタム車6
メソッドを呼び出して出力(サブクラスにメソッドあり)
 this.name1:カスタム車1
 this.name2:カスタム車2
 this.name3:カスタム車3
 this.name4:カスタム車4
 this.name5:null
 this.name6:カスタム車6
メソッドを呼び出して出力(サブクラスにメソッドなし)
 this.name1:null
 this.name2:カスタム車2
 this.name3:null
 this.name4:カスタム車4
 this.name5:カスタム車5
 this.name6:カスタム車6

スーパークラス型の変数にサブクラスのインスタンスを代入した時の挙動

Car car2 = new CustomCar();
name1:フィールド代入 サブクラスにフィールドあり
name2:フィールド代入 サブクラスにフィールドなし
name3:メソッド代入(サブクラスにメソッドあり) サブクラスにフィールドあり
name4:メソッド代入(サブクラスにメソッドあり) サブクラスにフィールドなし
name5:メソッド代入(サブクラスにメソッドなし) サブクラスにフィールドあり
name6:メソッド代入(サブクラスにメソッドなし) サブクラスにフィールドなし
フィールド
 car2.name1:車1(カスタム機能未開放) // スーパークラス代入 スーパークラス参照出力
 car2.name2:車2(カスタム機能未開放) // スーパークラス代入 スーパークラス参照出力
 car2.name3:null                      // サブクラス代入処理サブクラス代入     スーパークラス参照出力
 car2.name4:車4(カスタム機能未開放) // サブクラス代入処理スーパークラス代入 スーパークラス参照出力
 car2.name5:車5(カスタム機能未開放) // スーパークラス代入処理スーパークラス代入 スーパークラス参照出力
 car2.name6:車6(カスタム機能未開放) // スーパークラス代入処理スーパークラス代入 スーパークラス参照出力
メソッドを呼び出して出力(サブクラスにメソッドあり)
 this.name1:null                       // スーパークラス代入 サブクラス出力処理サブクラス参照
 this.name2:車2(カスタム機能未開放)  // スーパークラス代入 サブクラス出力処理スーパークラス参照
 this.name3:車3(カスタム機能未開放)  // サブクラス代入処理サブクラス代入     サブクラス出力処理サブクラス参照
 this.name4:車4(カスタム機能未開放)  // サブクラス代入処理スーパークラス代入 サブクラス出力処理スーパークラス参照
 this.name5:null                       // スーパークラス代入処理スーパークラス代入 サブクラス出力処理サブクラス参照
 this.name6:車6(カスタム機能未開放)  // スーパークラス代入処理スーパークラス代入 サブクラス出力処理スーパークラス参照
メソッドを呼び出して出力(サブクラスにメソッドなし)
 this.name1:車1(カスタム機能未開放)  // スーパークラス代入 スーパークラス出力処理スーパークラス参照
 this.name2:車2(カスタム機能未開放)  // スーパークラス代入 スーパークラス出力処理スーパークラス参照
 this.name3:null                       // サブクラス代入処理サブクラス代入     スーパークラス出力処理スーパークラス参照
 this.name4:車4(カスタム機能未開放)  // サブクラス代入処理スーパークラス代入 スーパークラス出力処理スーパークラス参照
 this.name5:車5(カスタム機能未開放)  // スーパークラス代入処理スーパークラス代入 スーパークラス出力処理スーパークラス参照
 this.name6:車6(カスタム機能未開放)  // スーパークラス代入処理スーパークラス代入 スーパークラス出力処理スーパークラス参照

サブクラス型の変数にサブクラスのインスタンスを代入した時の挙動

Car car3 = new CustomCar();
name1:フィールド代入 サブクラスにフィールドあり
name2:フィールド代入 サブクラスにフィールドなし
name3:メソッド代入(サブクラスにメソッドあり) サブクラスにフィールドあり
name4:メソッド代入(サブクラスにメソッドあり) サブクラスにフィールドなし
name5:メソッド代入(サブクラスにメソッドなし) サブクラスにフィールドあり
name6:メソッド代入(サブクラスにメソッドなし) サブクラスにフィールドなし
フィールド
 car3.name1:カスタム車1 // サブクラス代入 サブクラス参照出力
 car3.name2:カスタム車2 // サブクラス代入 サブクラス参照出力
 car3.name3:カスタム車3 // サブクラス代入処理サブクラス代入
 car3.name4:カスタム車4 // サブクラス代入処理スーパークラス代入
 car3.name5:null
 car3.name6:カスタム車6
メソッドを呼び出して出力(サブクラスにメソッドあり)
 this.name1:カスタム車1 // サブクラス代入 サブクラス出力処理サブクラス参照
 this.name2:カスタム車2 // スーパークラス代入 サブクラス出力処理サブクラス参照
 this.name3:カスタム車3 // サブクラス代入処理サブクラス代入 サブクラス出力処理サブクラス参照
 this.name4:カスタム車4 // サブクラス代入処理スーパークラス代入 サブクラス出力処理スーパークラス参照
 this.name5:null        // スーパークラス代入処理スーパークラス代入 サブクラス出力処理サブクラス参照
 this.name6:カスタム車6 // スーパークラス代入処理スーパークラス代入 サブクラス出力処理スーパークラス参照
メソッドを呼び出して出力(サブクラスにメソッドなし)
 this.name1:null        // サブクラス代入 スーパークラス出力処理
 this.name2:カスタム車2 // スーパークラス代入 スーパークラス出力処理
 this.name3:null        // サブクラス代入処理サブクラス代入 スーパークラス出力処理スーパークラス参照
 this.name4:カスタム車4 // サブクラス代入処理スーパークラス代入 スーパークラス出力処理スーパークラス参照
 this.name5:カスタム車5 // スーパークラス代入処理スーパークラス代入 スーパークラス出力処理スーパークラス参照
 this.name6:カスタム車6 // スーパークラス代入処理スーパークラス代入 スーパークラス出力処理スーパークラス参照