Closed2

Javaの基本

あずきあずき

基本的な用語と実例

  • 色々と用語が出てきてややこしいので、備忘録として記載
  • 基本的な用語と、その実例をコードに示す。

用語

用語 説明
クラス 設計図のようなもの。
クラスフィールド クラス全体で共有される変数のことを指す。staticキーワードを使用して宣言される。
クラスメソッド クラス全体に共通する情報を取り扱うメソッドで、クラスに属する。staticキーワードを使用して宣言される。
インスタンス クラスにより生成される実態のようなもの。
インスタンスフィールド クラス内で宣言された変数。
インスタンスメソッド 各インスタンス固有のデータや動作を扱うメソッドで、インスタンスに属する。
コンストラクタ インスタンス生成時に自動で実行されるメソッド。インスタンスフィールドの初期化を行う
オーバーロード 引数の型や数が違えば、同名のメソッドを定義できる仕組み。
カプセル化 フィールドとメソッドへのアクセスをクラスの外部から制限すること。privateを用いる
ゲッター フィールドをprivateにしたうえで、クラス外から安全にフィールドの値を取得することを目的とした、フィールドの値を返すだけのメソッド。getFieldNameのように命名。
セッター privateのフィールドの値を変更するメソッド。setFieldNameのように命名。

Main
class Main {
  public static void main(String[] args) {
    Person person1 = new Person("Kate", "Jones", 27, 1.6, 50.0, "医者");
    person1.printData();
    
    Person person2 = new Person("John", "Christopher", "Smith", 65, 1.75, 80.0, "教師");
    person2.printData();
    
    // クラスメソッドの呼び出し
    Person.printCount();

    System.out.println("----------------------");
    // セッターの呼び出し
    person1.setJob("獣医");

    // ゲッターの呼び出し
    System.out.println("person1の仕事を" + person1.getJob() + "に変更しました");
    person1.printData();
  }
}

Person
class Person {
  // クラスフィールド
  private static int count = 0;
  // インスタンスフィールド
  private String firstName;
  private String middleName;
  private String lastName;
  private int age;
  private double height;
  private double weight;

  // コンストラクタ
  Person(String firstName, String lastName, int age, double height, double weight, String job) {
    Person.count++;
    this.firstName = firstName;
    this.lastName = lastName;
    this.age = age;
    this.height = height;
    this.weight = weight;
    this.job = job;
  }

  // コンストラクタ(オーバーロード)
  Person(String firstName, String middleName, String lastName, int age, double height, double weight, String job) {
    // this()による他コンストラクタの呼び出し
    this(firstName, lastName, age, height, weight, job);
    this.middleName = middleName;
  }

  // ゲッター
  public String getMiddleName() {
    return this.middleName;
  }
  public String getJob() {
    return this.job;
  }

  // セッター
  public void setMiddleName(String middleName) {
    this.middleName = middleName;
  }
  public void setJob(String job) {
    this.job = job;
  }

  // インスタンスメソッド
  public String fullName() {
    // middleNameがない場合とある場合で条件分岐
    if (this.middleName == null) {
      return this.firstName + " " + this.lastName;
    } else {
      return this.firstName + " " + this.middleName + " " + this.lastName;
    }
  }

  // インスタンスメソッド
  public void printData() {
    System.out.println("私の名前は" + this.fullName() + "です");
    System.out.println("年齢は" + this.age + "歳です");
    System.out.println("BMIは" + Math.round(this.bmi()) + "です");
  }

  // インスタンスメソッド
  public double bmi() {
    return this.weight / this.height / this.height;
  }

  // クラスメソッド
  public static void printCount() {
    System.out.println("合計" + Person.count + "人です");
  }
}

実行結果

あずきあずき

「継承」に関する用語と実例のコード

  • 「継承」はオブジェクト指向にて必須知識のため、こちらに記載する。

「継承」に関する用語

用語 説明
継承 既存のクラスのフィールドやメソッドを、別のクラスに引き継ぐ機能。サブクラス定義時にextendsを記載して実行する。
スーパークラス 継承元のクラス。
サブクラス 継承してできる新しいクラス。独自のフィールドやメソッドを追加可能。
オーバーライド スーパークラスから継承したメソッドと同名のメソッドをサブクラスに定義することで行う、スーパークラスのメソッドの内容の上書き
抽象メソッド 処理が未定のメソッド。メソッド定義時にabstractを記載する。{}の記載は不要 。オーバーライドは強制のため、サブクラスにはsuper()の記載も不要。
抽象クラス 抽象メソッドを1つ以上持つクラスで、インスタンスを生成することは出来ない。抽象クラスの定義時にはabstractの記載が必要。
多態性 サブクラスのインスタンスを、スーパークラスのクラス型変数に代入することができる特徴

「継承」に関する決まり事

スーパークラスのメソッドの呼び出し

  • オーバーライドしたメソッドにおいて、スーパークラスのメソッドをサブクラスで呼び出そうとする場合、super.メソッド名()とすると、スーパークラスのメソッドを呼び出すことが可能。

サブクラスでのコンストラクタの定義

  • サブクラスでコンストラクタを定義する場合、コンストラクタの先頭でスーパークラスのコンストラクタを呼び出さなければならない。
  • 呼び出し方はsuper();

サブクラスからのみアクセスを許可するフィールド

  • クラス内及びサブクラスからのみアクセスを許可するフィールドを作成したい場合は、privateの代わりにprotectedを使用することで実現可能。
  • 「サブクラスからのみアクセス可能」という点で、ゲッター・セッターとは異なる。

インスタンスフィールドでのインスタンスの持たせ方

  • インスタンスフィールドにクラス型の変数を定義することで、フィールドにインスタンスを持たせることが可能。
  • また、戻り値がインスタンスのメソッドを呼び出した後、そのまま続けて該当インスタンスに属するメソッドを呼び出すことが可能。

実例のコード

Main
class Main {
  public static void main(String[] args) {
    Person person1 = new Person("Kate", "Jones", 27, 1.6, 50.0);
    Person person2 = new Person("John", "Christopher", "Smith", 65, 1.75, 80.0);

    Car car = new Car("フェラーリ", "赤");
    Bicycle bicycle = new Bicycle("ビアンキ", "緑");
    
    person1.buy(car);
    
    person2.buy(bicycle);

    System.out.println("【車の情報】");
    car.printData();
    System.out.println("-----------------");
    System.out.println("【車の所有者の情報】");
    car.getOwner().printData();

    System.out.println("=================");
    System.out.println("【自転車の情報】");
    bicycle.printData();
    System.out.println("-----------------");
    System.out.println("【自転車の所有者の情報】");
    bicycle.getOwner().printData();
  }
}
Vehicle
// 抽象クラス
abstract class Vehicle {
  private String name;
  private String color;
  protected int distance = 0;
 // Personクラスのインスタンスの作成(Person型)
  private Person owner;

  Vehicle(String name, String color) {
    this.name = name;
    this.color = color;
  }

  public String getName() {
    return this.name;
  }
  public String getColor() {
    return this.color;
  }
  public int getDistance() {
    return this.distance;
  }
  public Person getOwner() {
    return this.owner;
  }
  public void setName(String name) {
    this.name = name;
  }
  public void setColor(String color) {
    this.color = color;
  }
  public void setOwner(Person person) {
    this.owner = person;
  }

  public void printData() {
    System.out.println("名前:" + this.name);
    System.out.println("色:" + this.color);
    System.out.println("走行距離:" + this.distance + "km");
  }

  // 抽象メソッド
  public abstract void run(int distance);
}
Bicycle
// 継承
class Bicycle extends Vehicle {
  Bicycle(String name, String color) {
    // スーパークラスのメソッドの呼び出し
    super(name, color);
  }

  // オーバーライド(ただし、抽象メソッドのため`super()`の記載は無し)
  public void run(int distance) {
    System.out.println(distance + "km走ります");
    this.distance += distance;
    System.out.println("走行距離:" + this.distance + "km");
  }
}
Car
// 継承
class Car extends Vehicle {
  private int fuel = 50;

  Car(String name, String color) {
    // スーパークラスのメソッドの呼び出し
    super(name, color);
  }

  public int getFuel() {
    return this.fuel;
  }

  // オーバーライド
  public void printData() {
    // スーパークラスのメソッドの呼び出し
    super.printData();
    System.out.println("ガソリン量:" + this.fuel + "L");
  }

  // オーバーライド(ただし、抽象メソッドのため`super()`の記載は無し)
  public void run(int distance) {
    System.out.println(distance + "km走ります");
    if (distance <= this.fuel) {
      this.distance += distance;
      this.fuel -= distance;
    } else {
      System.out.println("ガソリンが足りません");
    }
    System.out.println("走行距離:" + this.distance + "km");
    System.out.println("ガソリン量:" + this.fuel + "L");
  }

  public void charge(int litre) {
    System.out.println(litre + "L給油します");
    if (litre <= 0) {
      System.out.println("給油できません");
    } else if (litre + this.fuel >= 100) {
      System.out.println("満タンまで給油します");
      this.fuel = 100;
    } else {
      this.fuel += litre;
    }
    System.out.println("ガソリン量:" + this.fuel + "L");
  }
}
Person
class Person {
  private String firstName;
  private String middleName;
  private String lastName;
  private int age;
  private double height;
  private double weight;

  Person(String firstName, String lastName, int age, double height, double weight) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.age = age;
    this.height = height;
    this.weight = weight;
  }

  Person(String firstName, String middleName, String lastName, int age, double height, double weight) {
    this(firstName, lastName, age, height, weight);
    this.middleName = middleName;
  }
  
  public String fullName() {
    if (this.middleName == null) {
      return this.firstName + " " + this.lastName;
    } else {
      return this.firstName + " " + this.middleName + " " + this.lastName;
    }
  }

  public void printData() {
    System.out.println("名前は" + this.fullName() + "です");
    System.out.println("年齢は" + this.age + "歳です");
    System.out.println("身長は" + this.height + "mです");
    System.out.println("体重は" + this.weight + "kgです");
    System.out.println("BMIは" + Math.round(this.bmi()) + "です");
  }

  public double bmi() {
    return this.weight / this.height / this.height;
  }
  
  // 引数がCar型であろうがBicycle型であろうが、その継承元はVehicle型であるため、下記のように記載可能
  public void buy(Vehicle vehicle) {
    // ここでの`this`は、setOwnerメソッドの呼び出し元のクラス(Person)のインスタンス
    vehicle.setOwner(this);
  }
}
このスクラップは1ヶ月前にクローズされました