Itsukaraの日記

最新IT技術を勉強・実践中。最近はDeep Learningに注力。

interface、abstractなどの仕様確認(Java認定試験向け)

interface、abstract、initializer、staticの仕様再確認のために、プログラムを書いて試しました。Java認定試験に向けた腕試しに役立つかもしれないので、載せておきます。パッと見て分かる人もいるのか疑問ですが...

/*
 * interface、abstract、initializer、staticのテスト
 * 実行結果はファイルの最後に添付
 */

interface If {
/* コンパイルエラー: 型の開始が不正です (interfaceではstatic initializerを使えない) 
    static { // static initializer
        System.out.println("If.static initializer()");
    }
*/

/* コンパイルエラー: 型の開始が不正です (interfaceではinitializerを使えない) 
    { // initializer
        System.out.println("If.initializer()");
    }
*/
    String s = "If.s"; // public static finalが自動的に付く
    String t = "If.t"; // public static finalが自動的に付く
    void print();      // public abstractが自動的に付く
    
    // interfaceでもstatic methodは記述可能
    static void static_print() { // publicが自動的に付く
        System.out.println("If.static_print(): s = " + s);
    }
    // interfaceに記載するフィールドやメソッドはすべてpublicになる
    // implementsするclassでもメソッドをオーバーライドする際はpublicにする必要あり
    
    // static finalでも、実行時に決まる値を設定可能
    Acs acs = new Acs(); // public static finalが自動的に付く
}

class Ifi implements If {
    static { // static initializer
        System.out.println("Ifi.static_initializer()");
    }

    { // initializer
        System.out.println("Ifi.initializer()");
    }

    Ifi() { // constructor
        System.out.println("Ifi.constructor()");
    }
    
    void Ifi () { // Method (voidが付くためconstructorではない)
        System.out.println("Ifi.Ifi(): is not a constructor");
    }
    
    protected String t = "Ifi.t"; // interfaceのtを隠蔽する
    
//  void print() { // コンパイルエラー:(public)より弱いアクセス権限を割り当てようとしました
    public void print() {
        System.out.println("Ifi.print(): s = " + s + ", t = " + t);
    }

    static void static_print() {
        System.out.println("Ifi.static_print(): s = " + s);
    }
}

class Ifis extends Ifi {
    public String s = "Ifis.s";
    public void print () {
        System.out.println("Ifis.print(): called");
        super.print();
    }
}

class Ifi2 {
    String s = "Ifi2.s";
    String t = "Ifi2.t";
    public void print() {
        System.out.println("Ifi2.print(): s = " + s + ", t = " + t);
    }
}

class Ifi2s extends Ifi2 implements If {
}


abstract class Ac {
    static { // static initializer
        System.out.println("Ac.static_itializer()");
    }

    { // initializer
        System.out.println("Ac.initializer()");
    }

    static int ac_count = 0;
    public int ac_id;
    
    Ac () { // constructor
        ac_id = ac_count++;
        System.out.println("Ac.constructor(): ac_id = " + ac_id);
    }
    
    void Ac () { // Method (voidが付くためconstructorではない)
        System.out.println("Ac.Ac(): is not a constructor");
    }
    
    static void sAc () {
        System.out.println("Ac.sAc()");
    }
    
    static String ss = "Ac.ss";
    String s = "Ac.s";
//    void print(); // コンパイルエラー: メソッド本体がないか、abstractとして宣言されています
    abstract void print();
}

class Acs extends Ac {
    static { // static initializer
        System.out.println("Acs.static_initializer()");
    }

    { // initializer
        System.out.println("Acs.initializer()");
    }

    void Ac () { // Method (voidが付くためconstructorではない)
        System.out.println("Acc.Ac(): is not a constructor");
    }

    Acs() { // constructor
        System.out.println("Acs.constructor()");
    }

    void print() {
        System.out.println("<------------------------");
        System.out.println("Acs.print(): ac_id = " + ac_id);
        System.out.println("Acs.print(): ss = " + ss);
        System.out.println("Acs.print(): s = " + s);
        System.out.println("------------------------>");
    }
    
    void call_print() {
        System.out.println("Acss.call_print()");
        print();
    }
}

class Acss extends Acs {
    void print() {
        System.out.println("Acss.print()");
    }
}

class Acs2 extends Ac {
    static { // static initializer
        System.out.println("Acs2.static_initializer()");
    }

    { // initializer
        System.out.println("Acs2.initializer()");
    }

    Acs2() { // constructor
        System.out.println("Acs2.constructor()");
    }

    static void sAc () {
        System.out.println("Ac2.sAc()");
    }
    
    void print() {
        System.out.println("<------------------------");
        System.out.println("Acs2.print(): ac_id = " + ac_id);
        System.out.println("Acs2.print(): ((Ac)this).ss = " + ((Ac)this).ss);
        System.out.println("Acs2.print(): ((Ac)this).s = " + ((Ac)this).s);
        System.out.println("Acs2.print(): ss = " + ss);
        System.out.println("Acs2.print(): s = " + s);
        System.out.println("------------------------>");
    }
    
    String ss = "Acs2.ss";
    String s = "Acs2.s";
}

public class TestInterface {

    public static void main(String[] arg) {
        Acs acs = new Acs();
        acs.print();
        acs.Ac();
        ((Ac)acs).Ac();
        
        acs.ss = "main set acs.ss";
        acs.s = "main set acs.s";
        acs.print();
        
        acs = new Acs();
        acs.print();
        acs.ss = "main set acs.ss again";
        acs.s = "main set acs.s again";
        acs.print();
        
        Acs2 acs2 = new Acs2();
        acs2.print();
        
        acs2.sAc();
        ((Ac)acs2).sAc();
        
        acs2.ss = "main set acs2.ss";
        acs2.s = "main set acs2.s";
        acs2.print();
        
        ((Ac)acs2).ss = "main set ((Ac)acs2).ss";
        ((Ac)acs2).s = "main set ((Ac)acs2).s";
        acs2.print();
        
        acs.print();
        
        Acss acss = new Acss();
        acss.call_print();

        System.out.println("@@@@@@@@@@@@@@@@@@@@@");

        Ifis ifis = new Ifis();
        ifis.s = "mains s";
        ifis.Ifi();
        ifis.static_print();
//      上記、abstractのstaticメソッドは、インスタンスのメソッドとして呼び出せる

        ifis.print();
        If.static_print();
        Ifis.static_print();
        If.acs.print();

        Ifi2s ifi2s = new Ifi2s();
//      ifi2s.static_print(); // コンパイルエラー:シンボルを見つけられません
//      上記、interfaceのstaticメソッドは、インスタンスのメソッドとして呼び出せない

        ifi2s.print();
//      System.out.println("ifi2s.s = " + ifi2s.s + ", ifi2s.t = " + ifi2s.t);
//      コンパイルエラー:sの参照はあいまいです ifi2の変数 sとIfの変数 sの両方が一致します
//      コンパイルエラー:tの参照はあいまいです ifi2の変数 tとIfの変数 tの両方が一致します
        System.out.println("((Ifi2)ifi2s).s = " + ((Ifi2)ifi2s).s + ", ((Ifi2)ifi2s).t = " + ((Ifi2)ifi2s).t);
        System.out.println("((If)ifi2s).s = " + ((If)ifi2s).s + ", ((If)ifi2s).t = " + ((If)ifi2s).t);

    }
}

/*
 * 実行結果:
 
F:\Java>java Testinterface
Ac.static_itializer()
Acs.static_initializer()
Ac.initializer()
Ac.constructor(): ac_id = 0
Acs.initializer()
Acs.constructor()
<------------------------
Acs.print(): ac_id = 0
Acs.print(): ss = Ac.ss
Acs.print(): s = Ac.s
------------------------>
Acc.Ac(): is not a constructor
Acc.Ac(): is not a constructor
<------------------------
Acs.print(): ac_id = 0
Acs.print(): ss = main set acs.ss
Acs.print(): s = main set acs.s
------------------------>
Ac.initializer()
Ac.constructor(): ac_id = 1
Acs.initializer()
Acs.constructor()
<------------------------
Acs.print(): ac_id = 1
Acs.print(): ss = main set acs.ss
Acs.print(): s = Ac.s
------------------------>
<------------------------
Acs.print(): ac_id = 1
Acs.print(): ss = main set acs.ss again
Acs.print(): s = main set acs.s again
------------------------>
Acs2.static_initializer()
Ac.initializer()
Ac.constructor(): ac_id = 2
Acs2.initializer()
Acs2.constructor()
<------------------------
Acs2.print(): ac_id = 2
Acs2.print(): ((Ac)this).ss = main set acs.ss again
Acs2.print(): ((Ac)this).s = Ac.s
Acs2.print(): ss = Acs2.ss
Acs2.print(): s = Acs2.s
------------------------>
Ac2.sAc()
Ac.sAc()
<------------------------
Acs2.print(): ac_id = 2
Acs2.print(): ((Ac)this).ss = main set acs.ss again
Acs2.print(): ((Ac)this).s = Ac.s
Acs2.print(): ss = main set acs2.ss
Acs2.print(): s = main set acs2.s
------------------------>
<------------------------
Acs2.print(): ac_id = 2
Acs2.print(): ((Ac)this).ss = main set ((Ac)acs2).ss
Acs2.print(): ((Ac)this).s = main set ((Ac)acs2).s
Acs2.print(): ss = main set acs2.ss
Acs2.print(): s = main set acs2.s
------------------------>
<------------------------
Acs.print(): ac_id = 1
Acs.print(): ss = main set ((Ac)acs2).ss
Acs.print(): s = main set acs.s again
------------------------>
Ac.initializer()
Ac.constructor(): ac_id = 3
Acs.initializer()
Acs.constructor()
Acss.call_print()
Acss.print()
@@@@@@@@@@@@@@@@@@@@@
Ifi.static_initializer()
Ifi.initializer()
Ifi.constructor()
Ifi.Ifi(): is not a constructor
Ifi.static_print(): s = If.s
Ifis.print(): called
Ifi.print(): s = If.s, t = Ifi.t
Ac.initializer()
Ac.constructor(): ac_id = 4
Acs.initializer()
Acs.constructor()
If.static_print(): s = If.s
Ifi.static_print(): s = If.s
<------------------------
Acs.print(): ac_id = 4
Acs.print(): ss = main set ((Ac)acs2).ss
Acs.print(): s = Ac.s
------------------------>
Ifi2.print(): s = Ifi2.s, t = Ifi2.t
((Ifi2)ifi2s).s = Ifi2.s, ((Ifi2)ifi2s).t = Ifi2.t
((If)ifi2s).s = If.s, ((If)ifi2s).t = If.t
*/