Javaのアクセス修飾子

3292 ワード

Javaのアクセス修飾子は、変数、メソッド、コンストラクション関数、またはクラスのアクセス性(範囲)を定義します.Javaには4種類のアクセス修飾子があります.
  • Public
  • Private
  • Protected
  • Default

  • デフォルトの修飾子を明確に使用する必要はありません.Public、Private、Protectedを指定しない場合、JVMはデフォルトの修飾子を使用します.
    Public修飾子
    Public修飾子は、任意のJavaクラスにアクセスできることを示します.クラスをpublicに設定すると、クラスはどこでも使用できます.次の例を見てみましょう.
  • orgの下にA.javaというクラス
  • を作成します.
    package org;
    
    public class A {
    
        public int a;
    
        public A(int a) {
            this.a = a;
        }
    
        public void methodA() {
            System.out.println("In method of class A");
        }
    }
    
  • orgの下にB.javaというクラス
  • を作成します.
    package org;
    
    import org.A;
    
    public class B {
    
        public static void main(String args[]) {
            A objA = new A(30);
            objA.methodA();
            System.out.println("Value of variable a is: " + objA.a);
        }
    }
    

    上記のプログラムを実行すると、次の出力結果が得られます.
    In method of class A Value of variable a is: 30
    Private修飾子
    Privateアクセス修飾子はクラス内でのみアクセスできます.クラスをネストしない限りprivateクラスとprotectedクラスは使用できません.例を見てみましょう
    package org;
    
    public class A {
    
        private int a;
    
        public A(int a) {
            this.a = a;
        }
    
        private void methodA() {
            System.out.println("In method of class A");
        }
    }
    public class B {
    
        public static void main(String args[]) {
            A objA = new A(30);
            objA.methodA();  //  20 
            System.out.println("Value of variable a is: " + objA.a); //  21 
        }
    }
    

    クラスBがクラスAのプライベート変数やメソッドにアクセスできないため、20行目と21行目でコンパイルエラーが発生します.
    デフォルトの修飾子
    アクセス権を設定しない場合は、JVMはデフォルトのアクセス権と見なします.デフォルトのアクセス修飾子を使用すると、現在のクラスパッケージ以外のクラスは、そのクラスのメソッド、変数、またはクラスにアクセスできません.
  • orgにDefaultAccess.javaというクラス
  • を作成する
    package org;
    
    public class DefaultAccess {
        int a;
    
        public DefaultAccess(int a) {
            this.a = a;
        }
    
        void methodA() {
            System.out.println("In method of class A");
        }
    }
    
  • comにB.javaというクラス
  • を作成する.
    package com;
    
    import org.DefaultAccess;
    
    public class B {
        
        public static void main(String args[]) {
            DefaultAccess obj = new DefaultAccess(20);
            obj.methodA(); // 9 
            System.out.println("Value of variable a is: " + obj.a); // 10 
        }
    }
    

    上記クラスBでは、パッケージ「org」の外でクラスDefaultAccessの変数aとメソッドmethodAにアクセスしようとしたため、9行目と10行目でコンパイルエラーが発生します.
    Protected修飾子
    Protectedアクセス修飾子は、同じパッケージまたはパッケージの外に継承することによってのみアクセスできます.例を見てみましょう
  • comにProtectA.javaというクラス
  • を作成
    package com;
    
    public class ProtectA {
        protected int a;
    
        protected ProtectA(int a){
            this.a=a;
        }
    
        protected void methodA() {
            System.out.println("In method of class A");
        }
    }
    
  • orgにProtectB.javaというクラス
  • を作成する
    package org;
    
    import com.ProtectA;
    
    public class ProtectB extends ProtectA {
        ProtectB(int a) {
            super(a);
        }
    
        public static void main(String args[]) {
            ProtectB objB = new ProtectB(20);
            objB.methodA();
            System.out.println("Value of variable a is: " + objB.a);
        }
    }
    

    上記のプログラムを実行すると、次の出力結果が得られます.
    In method of class A Value of variable a is: 20
    ご覧のように、ProtectAにアクセスする変数aとmethodAを継承することができます.