Java文法メモ クラス その2
クラスの継承
class Base { //... } class Sub extends Base{ //... }
メソッドのオーバーライド
class Base { void execute(){ //Baseクラスが行う処理 } } public class Sub extends Base{ void execute(){ //Subクラスが行う処理 } } //利用例 Sub obj = new Sub(); obj.execute(); //Subクラスの処理実行
基底クラスのメソッドの呼び出し
class Base { //基底クラス private int p; Base(int a){ p = a; } void execute(){ //Baseクラスが行う処理 } } class Sub extends Base{ //派生クラス private int q; Sub(int a, int b){ super(a); //基底クラスのコンストラクタを呼び出す q = b; } void execute(){ super.execute()//基底クラスのexecuteを呼び出す } }
多態性
class Base { void execute(){ } } class Sub1 extends Base{ void execute(){ } } class Sub2 extends Base{ void execute(){ } } Base baseObj = new Sub1(); baseObj .execute(); //Sub1クラスの処理実行 baseObj = new Sub2(); baseObj .execute(); //Sub2クラスの処理実行
継承の禁止
final接頭辞を付けることでそのクラスの継承を禁止することができます。
final class Sample
また、メソッドにfinalを付けることでそのメソッドのオーバーライドを禁止することができます。
class Sample{ final void method(){ } }
抽象クラス
abstract class Base{ abstract void method(); //抽象メソッド(宣言のみ) } class Derived extends Base{ void method(){ //実装 } }
[説明]
ペイントソフトなどで三角形や円など描画する状況を考えてみます。サイズというフィールドや「描画する」というメソッドを共通化することができるので、描画するものという概念をクラスとして抽出することができます。「描画するもの」クラスは描画するというメソッドを持ちますが、抽象化したものなのでその実装は考えられません。このような場合には抽象クラスと呼ばれるクラスを利用することができます。抽象クラスは自分自身をインスタンス化することはできません。派生クラスに実装を任せて初めて利用することができます。
abstract class Drawable { protected int size; void init(){//通常のメソッド } abstract void draw();//抽象メソッド(宣言のみ) } //具象化クラス(ここで抽象メソッドを実装する) class Circle extends Drawable{ private int x; private int y; private int radius; void draw(){ //円の描画処理 } } //利用例 //Drawable drawObj = new Drawable(); //Error 抽象クラスはインスタンス化できない Drawable drawObj = new Circle(); drawObj.draw();
インターフェース
インターフェースの定義と実装
public interface myInterface{ public void method1(); public void method2(); } class Concrete implements myInterface{ void method1(){ //実装 } void method2(){ //実装 } }
[説明]
予め操作の一群が定まっているような場合は、それらの操作をインタフェースとして提供することができます。インターフェースの宣言はclassではなくinterfaceを使います。操作の実装が決まっているわけではないため、インターフェース単体でインスタンス化することはできません。抽象クラスと似ていますが、抽象クラスのようにabstractでないメソッドを持つことはできません。interfaceは外部から利用するので全てのメソッドがpublic属性でなければなりません。また、インターフェースが持つフィールドはpublic,static,finalでなければなりません。
public interface MouseListener { public void mousePressed(int button, int x, int y); public void mouseDragged(int x,int y); } //利用する場合は全てのメソッドを実装しなければならない。 class Canvas implements MouseListener{ public void mousePressed(int button, int x, int y){ //実装 } public void mouseDragged(int x,int y){ //実装 } }
複数のインターフェースの実装
class Concrete implements Interface1,Interface2
public interface KeyboardListener{ public void keyPressed(int key); } class Canvas implements MouseListener,KeyboardListener{ public void mousePressed(int button, int x, int y){ //実装 } public void mouseDragged(int x,int y){ //実装 } public void keyPressed(int key){ //実装 } }
インターフェースの継承
クラスと同様にインターフェースそのものを継承することができます。
public interface InterfaceDerived extends InterfaceBase{ //InterfaceBaseのメソッド }
カメラの基本的な機能に加えて動画撮影機能を追加したインターフェースの例です。
public interface Camera { public void ZoomIn(); public void ZoomOut(); public void TakePicture(); } public interface DigitalCamera extends Camera { public void ZoomIn(); public void ZoomOut(); public void TakePicture(); public void TakeVideo(); }
インターフェースの多重継承
インターフェース同士で多重継承することができます。
public interface InterfaceDerived extends InterfaceBase1, InterfaceBase2{ //InterfaceBase1のメソッド //InterfaceBase2のメソッド }
マウスイベントとキーボードイベントの両方を検知するインターフェースを多重継承で定義した例です。
public interface UIListener extends MouseListener,KeyboardListener{ public void mousePressed(int button, int x, int y); public void mouseDragged(int x,int y); public void keyPressed(int key); } class Canvas implements UIListener { public void mousePressed(int button, int x, int y){ //実装 } public void mouseDragged(int x,int y){ //実装 } public void keyPressed(int key){ //実装 } }