Java類的訪問權(quán)限
Java類的訪問權(quán)限有兩種:
公共類和非公共類
使用public修飾的類為公共類,沒有使用public修飾的類為非公共類。
公共類的應(yīng)用場景
如果這個類想要在其他包中使用就定義為公共類
非公共類只能在當(dāng)前包中使用
訪問權(quán)限 |
當(dāng)前類 |
當(dāng)前包 |
派生類(不在當(dāng)前包中) |
其他包 |
私有的(private) |
可以 |
不 |
不 |
不 |
默認(rèn)的(沒有權(quán)限修飾符) |
可以 |
可以 |
不 |
不 |
受保護(hù)的(protected) |
可以 |
可以 |
可以 |
不 |
公共的(public) |
可以 |
可以 |
可以 |
可以 |
在定義類的成員時,遵循訪問權(quán)限最小化的原則。
如果想在任意位置都可以使用,就定義為public公共的。
如果想在當(dāng)前類和派生類中都可以直接使用,就定義為protected受保護(hù)的。
package com.bjpowernode.chapter01.demo02.p1;
public class Father {
private int xx = 10; //私有的, 只能在當(dāng)前類中使用
int yy = 20; //默認(rèn)的, 可以在當(dāng)前包中使用
protected int zz = 30; //受保護(hù)的, 當(dāng)前包/派生類中使用
public int oo = 40; //公共的, 任意位置
//在當(dāng)前類中
public void m1() {
System.out.println( xx );
System.out.println( yy );
System.out.println( zz );
System.out.println( oo );
}
}
package com.bjpowernode.chapter01.demo02.p1;
/**
* 測試訪問當(dāng)前包中Father類的成員權(quán)限
* 在同一個包中,可以使用默認(rèn)權(quán)限/受保護(hù)權(quán)限/公共權(quán)限的成員 ,不能使用私有成員
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
//創(chuàng)建Father類的對象
Father f = new Father();
//訪問f的實(shí)例成員
System.out.println(f.xx); //The field(字段/域) Father.xx is not visible(不可見), 沒有訪問權(quán)限
System.out.println(f.yy);
System.out.println(f.zz);
System.out.println(f.oo);
}
}
package com.bjpowernode.chapter01.demo02.p2;
import com.bjpowernode.chapter01.demo02.p1.Father;
/**
* 在p2包中, 測試訪問p1包中Father類的成員權(quán)限
* 只能訪問公共成員
* @author Administrator
*
*/
public class Test02 {
public static void main(String[] args) {
Father f = new Father();
//訪問f的成員變量
System.out.println(f.xx); //The field(字段/域) Father.xx is not visible(不可見), 沒有訪問權(quán)限
System.out.println(f.yy);
System.out.println(f.zz);
System.out.println(f.oo);
}
}
package com.bjpowernode.chapter01.demo02.p3;
import com.bjpowernode.chapter01.demo02.p1.Father;
/**
* p3包中定義Son類, 繼承p1包中的Father類
* 子類繼承了父類, 就自動擁有了父類的實(shí)例變量與實(shí)例方法
* Son類從Father類繼承了四個實(shí)例變量:xx,yy,zz,oo,和一個實(shí)例方法: m1()
* @author Administrator
*
*/
public class Son extends Father {
//Son類從Father類繼承了四個實(shí)例變量:xx,yy,zz,oo
//子類的實(shí)例方法
//因?yàn)槔^承,所有自動擁有, 是否能夠直接使用,跟訪問權(quán)限有關(guān)
public void sm() {
System.out.println( xx );
System.out.println( yy );
System.out.println( zz ); //受保護(hù)的
System.out.println( oo );
}
}
Java方法覆蓋中的訪問權(quán)限
Java訪問覆蓋(重寫)的規(guī)則:
● 子類方法簽名必須和父類方法一致, 方法簽名就是方法名與參數(shù)列表
● 子類方法的返回值類型可以和父類方法返回值類型一樣, 也可以是父類方法返回值類型的子類型
● 子類方法的訪問權(quán)限可以和父類方法訪問權(quán)限相同,也可以比父類方法訪問權(quán)限更寬泛(更大)
如果父類方法是public修飾,子類方法只能是public修飾
如果父類方法是protected修飾,子類方法可以protected/public修飾
● 子類方法的異常不能比父類方法的異常更大