java訪問權限

java訪問權限有四種

private:私有的,只有本類訪問

default(通常忽略不寫):同一個包內訪問

protected:同一個包,子類均可以訪問

public :公開的,所有類都可以訪問

使用範圍

四種都可以用來修飾成員變量、成員方法、構造函數

default和public可以修飾類

 

 

package test1;

public class A {
	private int v1 = 1;
	int v2 = 2;//如果沒有寫private/protected/public
	//那就是default。但是不能顯式寫default,寫了編譯器將報錯
	protected int v3 = 3;
	public int v4 = 4;
	
	private void showv1() {
		System.out.println(v1);
	}
	
	void showv2() {
		System.out.println(v2);
	}
	
	protected void showv3() {
		System.out.println(v3);
	}
	
	public void showv4() {
		System.out.println(v4);
	};
}

 

package test1;

public class B {
	public void show() {
		//B is not subclass of A//B不是A的子類,A的成員方法和變量無法訪問
		//System.out.println(v1);
		//System.out.println(v2);
		//System.out.println(v3);
		//System.out.println(v4);
		//showv1();
		//showv2();
		//showv3();
		//showv4();
		
		A obj = new A();//A類的private成員不能對外分享,但是其它的成員變量可以被同一個包的其他類訪問
		//System.out.println(obj.v1);error , private
		System.out.println(obj.v2);
		System.out.println(obj.v3);
		System.out.println(obj.v4);
		
		//obj.showv1();
		obj.showv2();
		obj.showv3();
		obj.showv4();
	}
}
package test1;

public class C extends A{//c類繼承與A類,因此C類是A的子類,而且C類和A類在同一個包中
	public void show() {//子類繼承父類所有的東西,但是不能直接訪問private的成員
		//System.out.println(v1);  error ,private;
		System.out.println(v2);
		System.out.println(v3);
		System.out.println(v4);
		//showv1();error ,private
		showv2();
		showv3();
		showv4();
		
		A obj = new A();
		//System.out.println(obj.v1); error ,private
		System.out.println(obj.v2);
		System.out.println(obj.v3);
		System.out.println(obj.v4);
		
		//obj.showv1();error  private
		obj.showv2();
		obj.showv3();
		obj.showv4();
	}
}
package test2;

import test1.A;

public class D extends A{//D是A的子類,但是不同包;
	public void show() {//D作爲A的子類,不能直接訪問A的private,又因爲D和A不同包,不能訪問default部分
		//System.out.println(v1);
		//System.out.println(v1);
		System.out.println(v3);
		System.out.println(v4);
		//showv1();error private
		//showv1();error default
		showv3();
		showv4();
		
		A obj = new A();
		//System.out.println(obj.v1);//error,private
		//System.out.println(obj.v2); //error ,default
		//System.out.println(obj.v3);// error protected作爲子類才能訪問
		System.out.println(obj.v4);
		//obj.showv1();private 
		//obj.showv2();default
		//obj.showv3();protected 只能子類才能訪問
		obj.showv4();
	}
}