まず、親クラス。
class ParentClass { private void func1() { System.out.println("Parent private func1"); } protected void func2() { System.out.println("Parent protected func2"); } public void func3() { System.out.println("Parent public func3"); } public void call() { this.func1(); this.func2(); this.func3(); } }private, protected, public の 3 種類のメソッドと、それらを呼び出すメソッドを作成。
子クラス1 は public に変更。
class Child1Class extends ParentClass { // メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません // @Override public void func1() { System.out.println("Child1 private -> public func1"); } @Override public void func2() { System.out.println("Child1 protected -> public func2"); } @Override public void func3() { System.out.println("Child1 public func3"); } }func1 は private メソッドをオーバーライド出来ないため、コンパイルエラーとなる。
@Override アノテーションを外すと、コンパイルは通る。
子クラス2 は protected に変更。
class Child2Class extends ParentClass { // メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません // @Override protected void func1() { System.out.println("Child2 private -> protected func1"); } @Override protected void func2() { System.out.println("Child2 protected func2"); } // Child2Class の func3() は ParentClass の func3() をオーバーライドできません。スーパークラスでの定義(public) より弱いアクセス特権を割り当てようとしました。 // @Override // protected void func3() { System.out.println("Child2 public -> protected func3"); } }func1 は同じようにエラー。
func3 は PHP と同じように、public -> private への変更でエラーとなる。func1 とは異なり、アノテーションを外しただけではエラー。定義自体を削除。
子クラス3 は private に変更。
aclass Child3Class extends ParentClass { // メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません // @Override private void func1() { System.out.println("Child3 private func1"); } // Child3Class の func2() は ParentClass の func2() をオーバーライドできません。スーパークラスでの定義(protected) より弱いアクセス特権を割り当てようとしました。 // @Override // private void func2() { System.out.println("Child3 protected -> private func2"); } // Child3Class の func3() は ParentClass の func3() をオーバーライドできません。スーパークラスでの定義(public) より弱いアクセス特権を割り当てようとしました。 // @Override // private void func3() { System.out.println("Child3 public -> private func3"); } }
func1 は同じようにエラー。
func2, func3 でエラーとなる。やはり、厳しい方向への変更はできないようだ。
実行してみると、
ParentClass p = new ParentClass(); p.call(); System.out.println("----------"); Child1Class c1 = new Child1Class(); c1.call(); System.out.println("----------"); Child2Class c2 = new Child2Class(); c2.call(); System.out.println("----------"); Child3Class c3 = new Child3Class(); c3.call();結果は、
Parent private func1 Parent protected func2 Parent public func3 ---------- Parent private func1 Child1 protected -> public func2 Child1 public func3 ---------- Parent private func1 Child2 protected func2 Parent public func3 ---------- Parent private func1 Parent protected func2 Parent public func3
エラー部分を削除したソース、結果共に、PHP と同じようになった。
protected -> public への変更はできるが、public -> protected -> private への変更はできない。
private はオーバーライドできない。
余談だが、コンパイルエラーとなるのはやはりいい。
0 件のコメント:
コメントを投稿