OCJ-P対策
クラスの継承関係あたりをメモ。
package sun.text; public class InheritanceExercise { String salute = "Hello"; public static void main(String[] args) { A a = new A(); B b = new B(); C c = new C(); E e = new E(); // コンパイル時にわかる継承関係に無いクラスはエラーになる // System.out.println(a instanceof B); System.out.println(c instanceof B); System.out.println(e instanceof D); // staticメソッドから、インスタンス変数にアクセスできない // System.out.println("Salute :" + salute); // インスタンスを作ってからアクセスすれば可 System.out.println("Salute :" + new InheritanceExercise().salute); } } /* * 継承関係にあるクラスの判定 */ class A { } class B { } class C extends B { } /* * インターフェースの実装の練習 */ interface D { // int a; // 変数は、暗黙的にpublic static final(これだけが許可) // abstract int a = 0; int a = 0; // メソッドは、暗黙的にpublic abstract(これだけが許可) // メソッド定義{}を書くとエラーになる // void A(){}; void A(); } class E implements D { // final変数になるので、値の変更はできない // a = 2; int b = a; // interfaceはpublicなので 可視性を下げることはできない // protected void A(){} public void A() { } } /* * 同じメソッド名、変数をもつインターフェースを継承したケース */ // インターフェースはインターフェースを継承できる interface D2 extends D { int a = 1; void A(); } class E2 implements D, D2 { // インターフェース変数は、重複はだめ。 // static変数なので、<インターフェース名>.変数名 // int b = a; int b = D2.a; // メソッドは重複OK!なぜなら、空実装だから。 @Override public void A() { } } /* * 抽象クラスの実装の練習 */ abstract class F { // 抽象メソッドでなければ、メソッド定義{}を書かないとエラーになる // void A(); // 抽象メソッドでなければ、実装クラスに実装を強制しない void A() { } // 逆に、抽象メソッドではメソッド定義を書くとエラー。 // 最後にセミコロンが必要! abstract protected void B(); } class G extends F { @Override // protectedより厳しくできない // void B() { public void B() { } }