HOME> Javaアプリケーション講座>継承>オーバーライド時における修飾子

オーバーライド時におけるアクセス修飾子

メソッドにはアクセス修飾子をつけてクラスからメンバーへのアクセスを制限することができました。
オーバーライドの時もそれが適用されます。

しかしオーバーライド時にはひとつだけ修飾子に関する決まりごとがあります。

オーバーライド時のアクセス修飾子のルール

サブクラスのメソッドはアクセスレベルをスーパクラスの メソッドより狭くしてはいけない

つまり、アクセス修飾子のところで説明したのを思い出してください

アクセス修飾子のレベルは

public → protected → 省略 → private の順でした。

したがって、もしスーパークラスのアクセス修飾子がpublicであれば サブクラスの
アクセス修飾子は publicしかつけれないことになります。

スーパークラスのアクセス修飾子を省略した場合は、サブクラスでは
public protected 省略 までのアクセス修飾子を指定できることになります。

ではその違いをわかるようにサンプルプログラムを見ていきます。
まずはエラーになるプログラムを見ていきます。

サンプルプログラム(Sample50.java)

class Sample50{
    public static void main(String args[]){

     Sub50 obj = new Sub50();

       obj.method();
    }

}

class Super50{

     public void method(){
          System.out.println("これはスーパークラスです");

   }
}

class Sub50 extends Super50{

             //サブクラスではアクセス修飾子を省略しています。

              void method(){
           System.out.println("これはサブクラスです");
    }
}
           

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

コンパイル・実行してみます。

このようなエラーがでました。
実にわかりやすいエラーだと思います。

スーパークラスのmethod()メソッドにはpublic をつけているのにサブクラスには省略
しています。このためこのようなエラーが出ます。

エラーを回避するためにはサブクラスにもpublic にするか、スーパークラスのpublicを
省略するか または、privateにしてやる必要があります。

次の2つのサンプルプログラムを見ていきます。

サンプルプログラム(Sample50_1.java)

class Sample50_1{
    public static void main(String args[]){

     Sub50_1 obj = new Sub50_1();

       obj.method();

    }

}

class Super50_1{

     public void method(){
          System.out.println("これはスーパークラスです");

   }
}

class Sub50_1 extends Super50_1{

             //サブクラスにもpublicをつけました

      public void method(){
           System.out.println("これはサブクラスです");
    }

}

プログラムをコピーする場合すべて選択をクリックしてください。

サンプルプログラム(Sample50_2.java)

class Sample50_2{
    public static void main(String args[]){
Sub50_2 obj = new Sub50_2(); obj.method(); } } class Super50_2{ //スーパークラスのpublic をはずしました void method(){ System.out.println("これはスーパークラスです"); } } class Sub50_2 extends Super50_2{ //サブクラスにもpublicをつけました public void method(){ System.out.println("これはサブクラスです"); } }

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

2つのプログラムをコンパイル・実行します。

このような結果になりました。

Sample50_1のほうはサブクラスにもpublicをつけることによりスーパークラスと
アクセス修飾子のレベルを同じにしてやりました。

また、Sample50_2のほうはスーパークラスのアクセス修飾子をはずしてやりました。
こうすることでサブクラスにはpublicがつけられています。
したがってサブクラスのほうがアクセス修飾子のレベルが広いことがわかります。

このことがオーバーライド時の修飾子のルールです。
サブクラスはスーパークラスよりアクセス修飾子のレベルを狭くしてはいけないということです。

ページのトップへ戻る