##【抽象クラス】
→abstract
を修飾子に持つクラス
→new演算子でオブジェクトを生成できない
→必ず処理内容が定義されていない抽象メソッドを持つ(演算子abstractをもつメソッド)
#####(抽象クラスの利用)
→サブクラスに拡張して利用
→必ず抽象メソッドをサブクラスで定義してオーバーライドする
//抽象クラス
abstract class Car{
abstract void show(); //抽象メソッド
}
//抽象クラスを引き継ぐサブクラス
public SuperCar extends Car{
System.out.println("スーパーカーを作成しました");
//抽象メソッドをオーバーライド
}
//この流れで抽象クラスを継承したサブクラスが使える
//抽象クラスは、抽象メソッドを必ず書くこと以外普通のスーパークラスとして処理を記述できる
→同名の抽象メソッドを必ず持っていることから抽象クラスを使えばそのサブクラスをまとめて簡単に扱うことができる
#####(instancsof演算子)
→抽象クラスではたくさんのサブクラスを扱う場合があるため、instanceof演算子を使うことでオブジェクトのクラスを調べられて便利
//抽象クラス
abstract class Car{
abstract void show(); //抽象メソッド
}
//抽象クラスを引き継ぐサブクラス
public SuperCar extends Car{
System.out.println("スーパーカーを作成しました");
}
//単独のクラス
class Home{
public Home(){
System.out.println("新しい家が建ちました");
}
}
class Main{
public static void main(String[] args){
SuperCar spcar = new SuperCar();
Home home = new Home();
if(spcar instanceof SuperCar){
System.out.println("SuperCarクラスです");
}
else{
System.out.println("SuperCarクラスじゃないです");
}//出力結果:「Carクラスです」
if(Home instanceof Car){
System.out.println("Carクラスです");
}
else{
System.out.println("Carクラスじゃないです");
}//出力結果「Carクラスじゃないです」
}
}
##【インターフェイス】
→interface
を修飾子にもつクラス
→インターフェイスのフィールドは自動的にpublic static final
をもつ
→インターフェイスのメソッドは自動的にabstract
をもつ
→原則としてメンバの内容を変更できない
→newを使ってオブジェクトを作成できない
※ただしインターフェイス型の変数は定義できるが、オブジェクトは生成できない
#####(インターフェイスの実装)
→インターフェイスはクラスと組み合わせて使う
class クラス名 implements インターフェイス{}
//インターフェイスのメンバを受け継ぐ
→インターフェイスを引き継いだクラスを利用するには、インターフェイスのメソッドをすべて定義する必要がある
→抽象クラスと同様に、サブクラスをまとめて扱うことができる
※原則として、メンバの内容は変更できないので抽象クラスとの違いに気を付ける
##【クラスの階層】
#####(多重継承)
→Javaではclass クラス名 extends A,B
のような多重継承はできない
→しかしインターフェイスなら二つ以上実装することが可能
class クラス名 implements A,B
#####(インターフェイスの拡張)
→インターフェイスもextends
を使うことで拡張可能
interface サブインターフェイス名 extends スーパーインターフェイス名{}
※なおサブインターフェイスを実装するときはextends
を使うので注意
※抽象クラスやインターフェイスは拡張する必要の多い大規模なプログラムで使われる