抽象クラスとかね。
今日も学校ー。
いよいよオブジェクト指向ならではな物が
ドンドン出てきてます。わくわく。
で、先週の木曜日、
バタバタしてたので書かなかったけど
そん時、主に習ったのは 配列とstatic。
またまた危なげな勝手解釈で
・配列
Javaには、基本データ型と参照データ型があるけど
配列は参照データ型で、つまりはクラスの1つなんで
インスタンスしないとアカン事、
初期化する際に、配列の数を指定せなアカンってーのが
String name = new String[5];
int age = new int[5];
…てな感じに使う模様。
[]の中の数字が、配列の数でっせ。
ただし、この配列よりも後で習うlistとやらの方が使うらしい。
・static
static な変数と関数(メソッド)がある模様。
「static変数(クラス変数)」は、perlやPHPで言うなら、
グローバル変数みたいなもん。
「static関数(クラスメソッド)」は、
要はインスタンス化しなくても、使えちゃう関数という事らしい。
ただし、そいつを呼べるのは、同じくstatic関数からのみ。
だから、mainはstaticらしい。
「クラスの外にある関数」と同じ立場っぽい。
例えば、perlで言うなら…
# クラス内のメソッドを使う場合
$objDB = new DB(); # インスタンス化
$objDB->connect(); # DBクラスのconnectメソッドを使う
# 「staticメソッド」にあたる関数を使う場合
&DB::connect(); # package DB 内のconnect関数を使う
&connect(); # どっかのconnect関数を使う
続いて、PHPで言うなら…
// クラス内のメソッドを使う場合
$objDB = new DB(); // インスタンス化
$objDB->connect(); // DBクラスのconnectメソッドを使う
// 「staticメソッド」にあたる関数を使う場合
connect(); // どっかのconnect関数を使う
…こんな感じか?(^^;
ほんで、今日の授業。
継承・オーバーライド・インターフェース・抽象クラスがテーマ。
・継承
- PHPと全く同じで、extendsを使い
コンストラクタ以外のものが
スーパークラスから継承される。
- スーパークラスを多重継承する事は出来ない。
- extendsを使わないスーパークラスですら
構造上では、Objectクラスのサブクラスという位置づけになる。
super.メンバ変数名; super.メソッド名();
…と書くが、super.メンバ変数を呼ぶのは、よろしくない(^^;
- サブクラス内で、自分のメンバ変数を呼ぶ場合は、
PHP同様 this を使い、this.メンバ変数名; と呼ぶ。
perlだけが、すんごく特殊な気が(^^;
// Java
public class サブクラス名 extends スーパークラス名 {
// うんたらかんたら
}
// PHP
class サブクラス名 extends スーパークラス名 {
// うんたらかんたら
}
# perl
@ISA = qw( スーパークラス名 );
・オーバーライド
サブクラス内にメソッドを作り、上書きしちゃう事。
・インターフェース
perlにはないような(^^;?
PHPには、5から導入されたらしい機能。
インスタンス化出来ない、大雑把なクラスのような物で、
含まれているのは、
引き数・戻り値の型を決めただけのメソッドと定数のみ。
これを継承してクラスを作り、
そのクラスをインスタンス化して使うが、
継承したクラス内では、必ずインターフェース内で定義した
メソッドを実装する事。
なお、クラスはクラスの多重継承は出来ないが、
インターフェースの多重継承は出来る。
例)
public interface インターフェース名1 {
public void メソッド名1(); // 抽象メソッド
public 戻り値の型 メソッド名2( int 引き数 ); // 抽象メソッド
}
public interface インターフェース名2 {
public void メソッド名3(); // 抽象メソッド
}
// 継承する側
public class クラス名 implements インターフェース名1, インターフェース名2 {
public void メソッド名1() {
// 中身を書く
}
public 戻り値の型 メソッド名2( int 引き数 ) {
// 中身を書く
}
public void メソッド名3() {
// 中身を書く
}
// その他、インターフェースにないメソッド・変数などを設定可能
}
ちなみに、以前の会社で、perlを使いながらも、
抽象メソッドみたいな書き方をしてた事があった。
sub 関数名(引き数の型); てな感じに。
これはなんて呼べばいいんだろう?(^^;
追記:
これはプロトタイプという機能でした(^^)
・抽象クラス
インターフェースとクラスのあいのこ(^^;
抽象メソッドを持ってもいいし、
メンバ変数も持っていいし、
完全なメソッドも持っても良いが、
やっぱりインスタンス化出来ないので、
他のクラスに継承した上で、使用する事。
例)
public abstract class 抽象クラス名 {
String errMessage;
public abstract void メソッド名1(); // 抽象クラス
public String returnError() { // 普通のメソッド
return this.errMessage;
}
}
…てな感じで、今日の授業まとめ、おしまい。