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 */