はじめに
この記事はJava Puzzlers Advent Calendar 2016の12日目の記事です。
ぼくはハイレベルなJavaプログラマーではないので、本エントリもハイレベルなJava puzzleではありません。力を抜いて眺めて下さい。
昨日の続きの問題
昨日の続編として、昨日のソースコードをちょっと変えたものを書きました。
/** * Created by yy_yank on 2016/11/12. */ public class Puzzler2 { Puzzler2 p = new Puzzler2(){ @Override public void exec(){ Puzzler2.main("で","て","る"); } }; public void exec(){} public void exec(String a){} public static void main(String... args){ new Puzzler2(){ @Override public void exec(){ Puzzler2.main("は", "な", "げ"); p.exec(); } }.exec(); } public static void main() { System.out.println("かかったな!"); } public static void main(String a, String b, String c) { System.out.println(a + b + c); } }
さて、このプログラムを実行するとどうなるでしょうか?
1.「はなげでてる」と出力される
2.「かかったな!」と出力される
3.コンパイルエラー
4.実行時エラー
正解
正解は………!
どどん!
スタックオーバーフローエラーが発生して実行時エラーとなります。
解説
mainメソッド内でPuzzler2クラスの匿名クラスを作成し、execメソッドをオーバーライドしています。
このメソッド内でPuzzler2.mainを実行していますが、これはmainメソッドのオーバーロードした別のmainメソッドを実行せず、自分自身を呼び出してしまいます。これにより、自分自身を呼び出し続けることになり、スタックオーバーフローエラーが発生してしまいます。
nullにまつわる問題
つづいて、nullに関する問題です。
以下のjavaソースコードファイルを用意します。
3つのクラスは同一ファイル内にあるものとします。
問題1
/** * Created by yy_yank on 2016/11/12. */ // 1 interface PuzzlerMain { static void main(String... args){ System.out.println("hello Puzzler3"); }; }
このクラスはコンパイル・実行できるでしょうか。
1.出来る 2.出来ない
問題2
class Pojo { public static void main(String... args) { System.out.println("hello pojo"); } }
class PuzzlerMainImpl implements PuzzlerMain { public static void run(String[] args) { ((Pojo) null).main("a", "b", "c"); ((PuzzlerMain) null).main("a", "b", "c"); ((PuzzlerMainImpl) null).main("a", "b", "c"); System.out.println("hello Puzzler3Impl"); } }
このPuzzlerMainImpl2はコンパイル・実行できるでしょうか。
1.出来る 2.出来ない
正解
問題1
コンパイル・実行出来る問題2
コンパイルエラーになる
解説
問題1について、
- interfaceにmainメソッドは書けます
問題2について、
((Pojo) null).main(“a”, “b”, “c”);
↑はコンパイルできます((PuzzlerMain) null).main(“a”, “b”, “c”);
↑はコンパイルできますせん
このような記述の場合、Interface型をレシーバーとしてstaticメソッドの実行はできません。
こんな感じのことを言われます
// illegal static interface method call\n\
// the receiver expression should be replaced with the type qualifier ”{0}”
*((PuzzlerMainImpl) null).main(“a”, “b”, “c”);
↑はコンパイルできません
Puzzler3インターフェースのmainメソッドを実行しようと思っても出来ません。あくまで、PuzzlerMainImplにはmainメソッドがないから無理ですよーって感じで怒られます
まとめ
いかがでしたでしょうか。どちらも簡単でしたね!
それではみなさんEnjoy Java Puzzler!!!!
2 件のコメント:
問題2はPuzzlerMainImpl2.javaが存在しないからコンパイルエラーなのでは?
saka1029さん
typoですね、PuzzlerMainImpl.javaが正しいです。
ありがとうございます、修正しておきます!
コメントを投稿