自分は物凄く忘れっぽい。
なので今日から技術的なことも恥ずかしがらずにどんどん書いていこう。
僅かではあるけれど情報発信にもなるし無益ということはないだろうし。
(情報の正確さには気を付けないといけないけど・・・)
今日のお題はdynamic binding, dynamic dispatching
動的束縛とか動的結合とも言われるみたい。
・・・というか調べても全然日本語サイトがヒットしなくて涙目。
現状ではdynamic binding = dynamic dispatching = 動的結合 = 動的束縛 という認識。
で、内容はというと
「どういう物だっけ?」
「どのメソッドが実行されるかは実行時でないと分からない、ってなんだっけ?」
という話。ポリモーフィズムの話。
ちなみに以下のサイトも参考になるので、俺のとこより良いかもしれません。
http://d.hatena.ne.jp/m383m/20080129/1201611382
ちょっと違うけどキャスト回りについて詳しい
http://www.kab-studio.biz/Programing/OOPinJava/08/03.html
まず例として以下のコードがあるとする。
[java] public class Super { public void printMyClassName(){ System.out.println("Super"); } } [/java]
Superクラスを継承してメソッドをオーバーライドしている。
[java] public class Sub extends Super { public void printMyClassName(){ System.out.println("Sub"); } } [/java]
上記のクラスを使用するためのMainクラス。
[java] public class Main { public static void main(String[] args) { Super s; s = new Sub(); s.printMyClassName(); } } [/java]
Super sという参照型変数があるが中身はnew Sub() つまり、型としてはSuperだが実体はSub
なのでmainメソッドは”Sub”を出力する。
今日の本題はここから・・・!
上記のそれを動的束縛だとか言うけど、正直どこら辺が動的なの?
普通にコンパイル前でもどのメソッドが実行されるかわかるじゃん。なんなんだよ!と。
忘れているうえにろくに考えない俺に、友人がなんとも的確なコードを示してくれました!
[java] public class Main { public static void main(String[] args) { Super s; if(args.length == 0) s = new Sub(); else s = new Super(); s.printMyClassName(); } } [/java]
なるほど・・・!これなら実行時までどっちのメソッドか分からない!
そうかこれが動的結合!これがポリモーフィズムだったんだ!
ちなみに一応解説するとs = new Super()は変数も実体もSuperなので当然、オーバーライド前のメソッドが実行されます。(”Super”と出力される)
流石にこれだけ書けば忘れないだろう。
コメントを残す