javaです。extends の使い方
import java.awt.*;import java.awt.event.*;
class BallsTest {
public static void main(String[] args){
BallFrame f = new BallFrame(); //(1)
f.setSize(400, 400); //(2)
f.addWindowListener(new WindowAdapter(){ //(3)
public void windowClosing(WindowEvent e){
System.exit(0);}});
f.show();
}
}
class BallFrame extends Frame {
public void paint(Graphics g) {
MyBall b1 = new MyBall();
b1.paint(g);
}
}
class MyBall {
public void paint(Graphics g) {
g.fillOval(50, 50, 20, 20);
}
}
ウインドウに1つ黒丸が表示されるプログラムです。extendsがあるので、BallFrameに対して親子関係になるものがextendsのあとに来るはずです。 ただし、なぜこのようにFrame と書かないとエラーがでてしまうのでしょうか? 名前は決められるものではないのでしょうか?
恐らく継承の一番のポイントの部分かと思います.
回答(1)
1.
class A extends B
は、AはBを継承/拡張して作るという意味です。つまり、Bの持つ機能は全てAにコピーされるということです。
FrameクラスはAwtパッケージに用意されているクラスで、画面上にウィンドウを作る基本的な機能を備えています。もし、このようなクラスを継承しないでウィンドウを作るとなると、システム毎に違った処理を自分で書かなければいけなくなって、とてもやっかいです。もし可能なら、C言語だけで、Windows/Mac/UNIXなどでウィンドウを作る作業をやってみると面倒なことがわかると思います。
プログラマー側がいちいち個別の手順を書かなくても大丈夫なように、Javaはいろいろなクラスを提供しています。そのひとつがFrameクラスで、作る方はそのクラスを継承するだけで、自分のクラスにその全ての機能を備えることができます。
Frameクラスをextendsしないとエラーになるのは、(2)と(3)の部分です。もしFrameから継承しないで作ったとすると、自分で作ったBallFrameにはsetSize()とかaddWindowListener()とかいうメソッドは書かれていないので、シンボルを解決できずにエラーとなります。
Frameクラスについては、マニュアル↓を参照して下さい。
コメント(4)
では、このようにフレームを表示したいときはFrame クラスを使って、スレッドのプログラムを書くときは
Threadクラスを使うのですか?
>>#1
ですです。ほしい機能が備わったクラスを継承して自分のクラスを作ります。Javaでは、1つのクラスしか継承は許されてないので、同時に2つのクラスの機能がほしいときは少し工夫しないといけないですね。たとえば、Threadクラスだと、Runnableというインターフェイス(抽象クラス)が用意されてますので、
class A extends B implements Runnable
とかすれば、Bの機能を持ちつつ、Thread機能(のメソッド名)をもつクラスを作ることができます。ただし、Runnableインターフェイスはrun()メソッドが抽象メソッドとして定義されていますので、class Aはこのメソッドの定義がないとエラーになります。
class A extends B implements Runnable
とかすれば、Bの機能を持ちつつ、Thread機能(のメソッド名)をもつクラスを作ることができます。>
class A implements Runnable{ と書くこともあります。 このときは
class A extends B implements Runnable {
とどう違いますか?



