読者です 読者をやめる 読者になる 読者になる

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() {
	}
}