0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

java初心者が行く~継承2~

Last updated at Posted at 2023-05-10

はじめに

java初心者が備忘録的に書いています

抽象クラスの考え方

今回は抽象クラスの継承についてまとめていく。
そもそも抽象クラスとはその名の通り抽象的なクラスである。具体例でイメージしてみる。
RPGゲーム作成で敵モンスターであるスライムクラスを作成する。フィールド変数にはHPとMPがあり、攻撃用のメソッドがある。さらに別でゴブリンクラスを作成する。同じくHPとMPをフィールド変数にもち、攻撃用クラスを持つ。
javaで書いてみると以下のようになる。

slime
public class Slime{
    int HP;
    int MP;
    pubric void attack(){
        //hoge
    }
} 
goblin
public class goblin{
    int HP;
    int MP;
    pubric void attack(){
        //hoge
    }
} 

こうやって書いたあと中身を見てみると同じようなコードを書いていていることがわかる。
なぜならスライムもゴブリンもどちらも「モンスター」だからである。この考え方が抽象クラスの考え方。
ここでいうモンスターとは「HP」、「MP」、「攻撃用メソッド」をもつキャラクターのこととする。
java風に言い換えると親クラスに「Monster」というクラスを持つ子クラス「Slime」と「Goblin」を作成すればコーディングが楽になる。
(もう少し良い説明方法浮かばなかったものかと反省)

抽象クラスの書き方

実際に書いてみる。

Monster
public abstract class Monster{//抽象クラスはclassの前にabstractをつける
    int HP;
    int MP;
    
    public abstract void attack(){
        
    }
}
Slime
public class Slime extends Monster(){//extendsで継承
    
    public Slime(int HP, int MP){//コンストラクタ
            super.HP = HP;
            super.MP = MP;
        }
    
    public void attack(){
        //hoge
    }
} 
Goblin
public class Goblin extends Monster(){//extendsで継承
    
    public Goblin(int HP, int MP){//コンストラクタ
            super.HP = HP;
            super.MP = MP;
        }
    
    public void attack(){
        //hoge
    }
} 

書き方自体はクラスの継承と変わらない

抽象クラスの特徴とメリット

抽象クラスのもっとも大きな特徴に「オブジェクトを直接生成できない」という(newできない)特徴がある。抽象クラスはあくまでも定義を行うクラスなのでnewを行おうとするとエラーがでる。

次に抽象クラスを使うメリットである。
抽象クラスを使うメリットは様々あるが、一番大きなメリットは実装の強制である。抽象クラスは、抽象メソッドを定義することができるため、サブクラスに必ず実装(これをオーバーライドという)させることができる(オーバーライドしないとエラー)。これにより実装漏れを防ぐことができる。ほかにもいろいろあるが初心者はこれくらい知っておけばいいんじゃね?(責任は取らぬ)

interface

抽象クラスの中にinterfaceというものがある。これは簡単に言うとめっちゃ抽象度が高いクラスのことをいう。
interfaceの大きな特徴は二つある。

  1. メソッドはすべて抽象メソッドである
  2. フィールドを一つも持たない

今回Monsterクラスを抽象クラスとしたがさらに抽象度の高いCharacterクラスを親クラスにつける。
implementsの書き方と継承方法は以下のように書く。最低限

Character
public interface Character{
    void walk();//public abstractは省略してもよい。理由は特徴1
}
Monster
public class Monster implements Character{//抽象クラスはclassの前にabstractをつける
    int HP;
    int MP;

    public void attack(){}
    public void walk() {}
}

後は同様にattackメソッドとwalkメソッドを実装した子クラス(Characterクラスから見たら孫クラス)を実装すればよい。

interfaceのメリット

interfaceはメソッドの処理内容を一切定義していないため通常のクラスでは許されていない多重継承が許されている。
メソッドの処理内容を一切定義していない->オーバーライドする必要があるため親クラスに同じ名前のクラスがあっても問題ないため多重継承できる。

ちなみにextendとinterfaceを同時に使うこともできるがそれはまた別の機会に、、、

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?