2016/12/12 このエントリーをはてなブックマークに追加 はてなブックマーク - Java Puzzler〜続・mainメソッドの実行とnullのオブジェクト実行〜

Java Puzzler〜続・mainメソッドの実行とnullのオブジェクト実行〜





この記事は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に関する問題です。
以下の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 件のコメント:

  1. 問題2はPuzzlerMainImpl2.javaが存在しないからコンパイルエラーなのでは?

    返信削除
  2. saka1029さん

    typoですね、PuzzlerMainImpl.javaが正しいです。
    ありがとうございます、修正しておきます!

    返信削除