Java:(クラスの)継承とは何か

 

専門用が分からないのは、それが「カタカナ」だから、と思えたりしますが
日本語(漢字)にしたところで、わからないものは分からないわけです。

毎度、管理人イガジーです。

という訳で、今日は「継承」という専門用語について書いてみます。
「継承」についての解説は、色々なところにあると思います。
でも、それを読んでもピンと来ない方も多いのではないでしょうか。

論より実例、継承とは extends です。(やっぱり分かりませんよね ^^; )
例えば、Label というクラス(コンポーネント)を使って文字を表示させると
左詰めになります。
中央寄せにしたい時は、次のようにsetAlignment(Label.CENTER)と
すれば良いのですが

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class ExtendsLabel {
	Frame f;
	ExtendsLabel(){ // constructor
		f=new Frame("Center Label");
		f.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent ev) {
                System.exit(0);
            }
		});
		Label lb=new Label("Hello");
		lb.setAlignment(Label.CENTER);
		f.add(lb,BorderLayout.CENTER);
		f.setSize(200,80);
		f.setVisible(true);
	}

	public static void main(String[] args) {
		new ExtendsLabel();
	}
}

最初から、中央寄せになっているLabelがあれば便利なのに、
と思うかもしれません(少々こじつけ)。

そんなあなたに、中央寄せラベル(CenterLabel)をご提供しましょう。

class CenterLabel extends Label {
	private static final long serialVersionUID = 1L;
	CenterLabel(){
		super();
		this.setAlignment(Label.CENTER);
	}
	CenterLabel(String str){
		super(str);
		this.setAlignment(Label.CENTER);
	}
}

これを使えば
CenterLabel clb=new CenterLabel("Hello");で表示される文字は中央寄せになります。
しかも、このclbに対して、setBackground()で背景色を指定したり
setFont()で、フォントを変えたりが、普通のLabelと同じようにできるのです。
CenterLabel のクラス定義には、setBackground()は無いのに、
動作するのです。
これは、extends する元の Label が setBackground() を持っているから
なのですね(正確には、ちょっと違いますけれど)。

extends した場合、親(superクラス)の持っている機能(メソッド)は
そのまま使えるのです。これが継承。

子が持っていなくても親が持っていれば使える、というと
なんだか親の七光りを頼る苦労知らずの息子みたいなのですが、
プログラミングでは、(親を頼って)苦労せずに済ませられれば、
それはそれで幸せなのです。

Labelに関して言うと、実は Label(“文字列”,Label.CENTER); と書けば
中央寄せにできてしまいます。(のですが、説明の都合上こじつけました ^^; )

動作確認用のサンプルコードを添えておきます。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Label;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;


public class ExtendsLabel {
	Frame f;
	ExtendsLabel(){ // constructor
		f=new Frame("Center Label");
		f.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent ev) {
                System.exit(0);
            }
		});
		Label lb=new Label("Label+setAlignment");
		lb.setAlignment(Label.CENTER);
		f.add(lb,BorderLayout.NORTH);
		CenterLabel clb= new CenterLabel("CenterLabel");
		clb.setBackground(Color.YELLOW);
		f.add(clb,BorderLayout.CENTER);
		Label lb2=new Label("Label,Label.CENTER",Label.CENTER);
		f.add(lb2,BorderLayout.SOUTH);
		f.setSize(200,120);
		f.setVisible(true);
	}

	class CenterLabel extends Label {
		private static final long serialVersionUID = 1L;
		CenterLabel(){
			super();
			this.setAlignment(Label.CENTER);
		}
		CenterLabel(String str){
			super(str);
			this.setAlignment(Label.CENTER);
		}
	}

	public static void main(String[] args) {
		new ExtendsLabel();
	}
}

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)