プログラミング

Java 学習 【lesson 9 : オブジェクト指向(2)】

更新日:

前回の続きでオブジェクト指向について見ていきます。今回はオブジェクト指向の3大要素「カプセル化」「継承」「ポリモーフィズム」についてです。

1. カプセル化

データの内部構造を外のクラスから変更できないようにし、代わりに外部に操作のためのインターフェースを提供することです。例を見てみましょう。

public class Sample {
	private Integer id;

    // ゲッター
	public Integer getId() {
		return id;
	}

        // セッター
	public void setId(Integer id) {
		this.id = id;
	}
	
}

privateという修飾子をつけていますが、これは同じクラスからのみ参照可能ということを表しています。つまり、ほかのクラスから直接idの値を変えようとしてもエラーとなります。

その代わりにidの値を操作するメソッドとしてgetId()とsetId()を用意しています。これらはそれぞれゲッターとセッターと呼びます。セッターでidの値を入れ替え、ゲッターでidの値を取得できます。Sampleと同じパッケージにMainというクラスを作ってみます。

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

		Sample s = new Sample();
		
		s.setId(10);
		
		System.out.println(s.getId());
		
	}
}

// 出力結果
10

このようにセッターで値を入れ、ゲッターで値を取得できました。ちなみに、同じパッケージ内だとSampleクラスをインポート不要ですが、異なるパッケージになるとimportする必要があるので注意してください。

例えばMainクラスがあるパッケージの下にsampleパッケージを作り、その中にSampleクラスを入れた場合は以下のようにMainクラスで記載が必要になります。

//追加
import sample.Sample;

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

		Sample s = new Sample();

		s.setId(10);

		System.out.println(s.getId());

	}
}

eclipseだとSampleと書いた部分に赤波線が入り、そこにカーソルを持っていくとSampleをインポートしてくれるクイックフィックスが出てきます。楽なので活用してもよいでしょう。

2. 継承

次は継承についてです。継承はクラスの機能を引き継ぐクラスを作成することです。継承元をスーパークラス(親クラス)、継承先をサブクラス(子クラス)と言います。例えばCharacterというスーパークラスがあってHeroというサブクラスがあったとします。CharacterとHeroが持つ情報が以下の通りだとします

・Character (name, hp, attack)

・Hero (name, hp, attack, weapon)

HeroとCharacterの違いはweaponだけなので、Heroがキャラクターを継承してweaponだけ追加すればよさそうです。早速作ってみましょう。まずは、Characterから。

public class Character {
	private String name;

	private Integer hp;

	private Integer attack;

	//コンストラクタ
	Character(){
	}

	//初期値ありのコンストラクタ
	Character(String name, Integer hp, Integer attack){
		this.name = name;
		this.hp = hp;
		this.attack = attack;
	}

	//ゲッターとセッター
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getHp() {
		return hp;
	}

	public void setHp(Integer hp) {
		this.hp = hp;
	}

	public Integer getAttack() {
		return attack;
	}

	public void setAttack(Integer attack) {
		this.attack = attack;
	}
}

 

コンストラクタとありますが、これは他のクラスでnewした際の挙動を決めています。何も引数が入っていない場合がデフォルトとなっており、何も書かなかった場合は引数なしとなります。引数ありの場合はnewする際に引数を渡してあげることであらかじめ初期値を与えることができます。引数ありを書いた場合、引数なしを書かないと引数なしでnewすることができなくなるので注意が必要です。

次はHeroクラスを作っていきましょう。

 

public class Hero extends Character {
	private Integer weapon;
	
	public Integer getWeapon() {
		return weapon;
	}

	public void setWeapon(Integer weapon) {
		this.weapon = weapon;
	}

	//引数なしのコンストラクタ
	Hero(){
	}

	//引数ありのコンストラクタ
	Hero(String name, Integer hp, Integer attack, Integer weapon){
		super(name, hp, attack);
		this.weapon = weapon;
	}
}

Characterを継承するためにクラスを定義する部分で、extends Characterと記載しています。また、コンストラクタの部分でsuper(name, hp, attack)と書くことでCharacterの引数ありコンストラクタを呼び出しています。では実際にHeroを動かすクラス(Game)を作って挙動を確かめましょう。

public class Game {
	public static void main(String[] args){
		Hero hero = new Hero("勇者", 10, 5, 2);

		System.out.println(hero.getName() + "のHPは"
							+ hero.getHp() + "で攻撃力は" + hero.getAttack()
							+ "武器の強さは" + hero.getWeapon() + "だ!");
	}
}

//出力結果
勇者のHPは10で攻撃力は5武器の強さは2だ!

このような形でCharacterの内容が反映されたHeroができているのがわかります。

3. ポリモーフィズム

継承されたスーパークラスの挙動をサブクラスごとに作り替えることです。同じメソッド名でクラスごとに違う動きを定義できます。

public class Sample {
  public static void main(String[] args) {
    Vehicle[] vehicles =  {new Car(), new Airplane(), new Bicycle(), new Vehicle()};

    for (Vehicle v : vehicles) {
      v.introduce();
    }
  }
}
class Vehicle {
  public void introduce() { System.out.println("これは乗り物です。"); }
}
class Car extends Vehicle {
  @Override
  public void introduce() { System.out.println("この乗り物は車です"); }
}
class Airplane extends Vehicle {
  @Override
  public void introduce() { System.out.println("この乗り物は飛行機です!"); }
}
class Bicycle extends Vehicle{
  @Override
  public void introduce() { System.out.println("この乗り物は自転車です!"); }
}

// 実行結果
この乗り物は車です
この乗り物は飛行機です!
この乗り物は自転車です!
これは乗り物です。

@Overrideを使うことで、スーパークラスのメソッドをサブクラスで再定義できます。継承関係になっていないとエラーとなるため注意が必要です。

今回はオブジェクト指向の3大要素について見てきました。ひとまずオブジェクト指向和終わりとしたいと思います。概念的には難しいので、オブジェクト指向で書かれたプログラミングをまねて書きながら学ぶのが良いかもしれません。

-プログラミング
-,

Copyright© 人生を変える備忘録 , 2022 All Rights Reserved Powered by STINGER.