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();
}
}
この記事へのコメントはこちら