第8回 アクセス修飾子

public class Main {
  public static void main(String args[]) {
    //--------------------------------------------------//
    // 他のクラスからの呼び出し例
    //--------------------------------------------------//
    System.out.println("他のクラスからの呼び出し例");
    
    //**************************************************//
    // インスタンス変数の例
    //**************************************************//
    // publicなインスタンス変数にアクセス OK
    System.out.println( new Hoge().a );
    
    // privateなインスタンス変数にアクセスNG
    // System.out.println( new Hoge().b );   エラー
    
    // protectedなインスタンス変数にアクセス
    // 同じパッケージの場合OK
    // 別パッケージの場合NG
    System.out.println( new Hoge().c );
    
    //**************************************************//
    // メソッド呼び出しの例
    //**************************************************//   
    // publicなメソッド呼び出し OK
    System.out.println( new Hoge().m() );
    
    // privateなメソッド呼び出しNG
    // System.out.println( new Hoge().f() ); エラー
    
    // privateなインスタンス変数を内部で使っているpublicなメソッド呼び出し OK
    System.out.println( new Hoge().get_b() );
    
    // privateなメソッドを呼び出しているpublicなメソッド呼び出し OK
    System.out.println( new Hoge().get_f() );
    
    // protectedなメソッド呼び出し
    // 同じパッケージの場合OK
    // 別パッケージの場合NG
    System.out.println( new Hoge().h() );
    
    
    //--------------------------------------------------//
    // 継承したクラスからの呼び出し例
    //--------------------------------------------------//
    System.out.println("継承したクラスの呼び出し例");
    //**************************************************//
    // インスタンス変数の例
    //**************************************************//
    // publicなインスタンス変数にアクセス OK
    System.out.println( 
      new Hoge(){ public String get_a(){ return a; } }.get_a()
    );
    
    // privateなインスタンス変数にアクセスNG
    // System.out.println( 
    //     new Hoge(){ public String get_b(){ return b; } }.get_b()
    //   ); エラー
    
    // protectedなインスタンス変数にアクセス
    // 同じパッケージの場合OK
    // 別パッケージの場合もOK!!
    // そもそもprotectedは子クラスからは触れても、
    // 他のクラスからは触らせたくない仕組み
    System.out.println( 
      new Hoge(){ public String get_c(){ return c; } }.get_c()
    );
    
    //**************************************************//
    // メソッド呼び出しの例
    //**************************************************//   
    // publicなメソッド呼び出し OK
    System.out.println( 
      new Hoge(){ public String do_m(){ return m(); } }.do_m()
    );
    
    // privateなメソッド呼び出しNG
    //System.out.println( 
    //  new Hoge(){ public String do_f(){ return f(); } }.do_f()
    //); エラー
    
    // protectedなメソッド呼び出し
    // 同じパッケージの場合OK
    // 別パッケージの場合もOK!!
    // そもそもprotectedは子クラスからは触れても、
    // 他のクラスからは触らせたくない仕組み
    System.out.println( 
      new Hoge(){ public String do_h(){ return h(); } }.do_h()
    );
  }
}

class Hoge{
  public    String a = "a";
  private   String b = "b";
  protected String c = "c";
  
  public    String m(){ return "m"; }
  private   String f(){ return "f"; }
  protected String h(){ return "h"; }
  
  public    String get_b(){ return b;   }
  public    String get_f(){ return f(); }
}


結果:

他のクラスからの呼び出し例
a
c
m
b
f
h
継承したクラスの呼び出し例
a
c
m
h


参考:
Javaの道:クラス(8.アクセスレベル)