1. 程式人生 > >java中四種訪問修飾符

java中四種訪問修飾符

pub oid 默認 成員變量 修飾 對象 fault 其中 ()

Java中的四種訪問修飾符:public、protected、default(無修飾符,默認)、private。

  • 四種修飾符可修飾的成分(類、方法、成員變量)
public protected default private

×

×(內部類可以用private修飾)
方法

成員變量

  • 四種修飾符的訪問權限

public:對所有類可見

protected:對同一包中的類可見、對同一包及不同包中的子類可見

default:對同一包中的類可見、對同一包中的子類可見

private:僅對類本身可見

可見是可訪問的意思,即由這些修飾符修飾的成分(類、方法、成員變量)可以被其它類訪問。對子類可見即子類可以繼承。

這裏需要註意的是protected與default,二者的區別在於不同包中的子類是否可以繼承。

訪問權限 同一包 同一包中的子類 不同包中的子類 不同包
public

protected

×
default

× ×
private

× × × ×

  • 例如

package1:ParentClass、ChildClassOne、TestOne

package2:ChildClassTwo、TestTwo

package3:TestThree

其中ParentClass為

public class ParentClass {

	public int a=2;
	protected int b = 3;
	int c = 4;
	private int d = 5;

}

  1.對於TestOne來說,ParentClass類、a、b、c均可見,d不可見。即在TestOne中可以new一個ParentClass對象,且該對象中的a,b,c變量可操作。如下:

public class TestOne {

	public static void main(String args[]) {

		ParentClass obj = new ParentClass();

		System.out.println(obj.a);
		System.out.println(obj.b);
		System.out.println(obj.c);
//		System.out.println(obj.d);     //d 不可見
	}
}

  2. ChildClassOne繼承ParentClass且與其在同一個包中,則a、b、c均可見,d不可見。

public class ChildClassOne extends ParentClass{

	public static void main(String args[]) {

		ChildClassOne obj = new ChildClassOne();

		System.out.println(obj.a);
		System.out.println(obj.b);
		System.out.println(obj.c);
//		System.out.println(obj.d);      // d不可見
	}
}

  3. ChildClassTwo繼承ParentClass,則a、b均可見,d不可見,由於子類與ParentClass不在同一包中,故c(default類型)不可見。

public class ChildClassTwo extends ParentClass{

	public static void main(String args[]) {
		ChildClassTwo obj = new ChildClassTwo();

		System.out.println(obj.a);
		System.out.println(obj.b);
//		System.out.println(obj.c);    // c不可見
//		System.out.println(obj.d);    // d不可見
	}
}

 4.對於TestTwo來說,ParentClass類、a均可見,b、c、d不可見。由於TestTwo與ParentClass不在同一個包中,故只有public修飾的成分可見。

public class TestTwo {

	public static void main(String args[]) {

		ParentClass obj = new ParentClass();
		System.out.println(obj.a);
//		System.out.println(obj.b);     // b 不可見
//		System.out.println(obj.c);     // c 不可見
//		System.out.println(obj.d);     // d 不可見
	}
}

 

  • 另外值得註意的是繼承父類的子類與其他類之間的可見性,取決於其他類與父類之間的可見性。

對於TestOne來說,ChildClassOne中a,b,c都可見,d不可見,這是由於TestOne與ParentClass在同一個包中。

而對於TestThree來說,ChildClassOne中只有a可見,這是由於TestThree與ParentClass在不同的包中。

需要註意:

雖然a、b對ChildClassTwo可見,TestTwo與ChildClassTwo在同一包中,

但對於TestTwo來說,ChildClassTwo中只有a可見,這是由於TestTwo與ParentClass在不同的包中,只有public修飾的可見。

java中四種訪問修飾符