Java基礎學習筆記(九)—— java中的private,protected,public與靜態代碼塊
Life was like a box of chocolates, you never know what you’re gonna get.
| @Author:TTODS
封裝性與訪問控制
java面向對象的封裝性是通過對成員變量和方法進行訪問控制實現的,訪問控制分爲4個等級:私有、默認、保護和公有。
私有級別
私有級別的關鍵字是private
,私有級別限制性最高,私有級別的成員變量和方法只能在其所在的類內部自由使用,在其他類中則不允許直接訪問。
//first包中的MyFirstClass.java文件
package first;
public class MyFirstClass{
private int privateData; //私有成員變量
public MyFirstClass() {
privateData =1;
}
//私有方法
private void printData() {
System.out.println(privateData);
}
}
//first 包中的MySecondClass.java文件
package first;
public class MySecondClass{
public static void main(String[] args) {
MyFirstClass firstClass = new MyFirstClass();
firstClass.privateData=0; //報錯 字段 MyFirstClass.privateData 不可視
firstClass.printData(); //報錯 類型 MyFirstClass 中的方法 printData()不可視
}
}
默認級別
默認級別就是在聲明變量不加修飾詞,它的限制性介於private
和protected
之間。默認級別的成員變量和方法,可以在其所在的類內部和同一個包的其他類中被直接訪問,但在不同的包的類中則不允許直接訪問
//first包內的MyFristClass.java文件
package first;
public class MyFirstClass{
int defaultData; //默認級別成員變量
public MyFirstClass() {
defaultData =1;
}
//默認級別方法
void printData() {
System.out.println(defaultData);
}
}
//first包內的MySecondClass.java文件
package first;
public class MySecondClass{
public static void main(String[] args) {
MyFirstClass firstClass = new MyFirstClass();
firstClass.defaultData=0; //可以訪問
firstClass.printData(); //可以訪問
}
}
//second 包內的MyThridClass.java文件
package second;
import first.MyFirstClass;
public class MyThridClass{
public static void main(String[] args) {
MyFirstClass firstClass = new MyFirstClass();
firstClass.defaultData;// 報錯 字段 MyFirstClass.defaultData 不可視
firstClass.printData();// 報錯 類型 MyFirstClass 中的方法 printData()不可視
}
}
保護級別
保護級別的關鍵字是protected
,保護級別在同一包中完全與默認訪問級別一樣(可以在其所在的類內部和同一個包的其他類中被直接訪問),但是不同包中子類能夠繼承父類中的protected
變量和方法,這就是所謂的保護級別,“保護”就是保護某個類的子類都能繼承該類的變量和方法。
//first包內的MyFristClass.java文件
package first;
public class MyFirstClass{
protected int protectedData; //保護級別成員變量
public MyFirstClass() {
protectedData =1;
}
//保護級別方法
protected void printData() {
System.out.println(protectedData);
}
}
//first包內的MySecondClass.java文件
package first;
public class MySecondClass{
public static void main(String[] args) {
MyFirstClass firstClass = new MyFirstClass();
firstClass.protectedData=0;
firstClass.printData();
}
}
//second 包內的MyThridtClass.java文件
package second;
import first.MyFirstClass;
public class MyThridClass extends MyFirstClass{
void show() {
printData(); //printData方法是從父類繼承下來的
System.out.println(protectedData); //protectedData 也是從父類繼承下來的
}
}
公有級別
公有級別的關鍵字是public,公有級別的成員變量和方法可以在任何場合被直接訪問,是最寬鬆的一種訪問控制等級。
簡單總結
訪問成員有兩種方式:一種是調用,即通過類或對象調用它的成員,如firstClass.printData()
語句;另一種是繼承,即子類繼承父類的成員變量和方法。
- 公有訪問級別任何情況下兩種方式都可以;
- 默認訪問級別在同一包中兩種訪問方式都可以,不能在包之外訪問;
- 保護訪問級別在同一包中與默認訪問級別一樣,兩種訪問方式都可以。但是在不同包之外只能繼承訪問;
- 私有訪問級別只能在本類中通過調用方法訪問,不能繼承訪問。
靜態變量和靜態方法
類中的變量可以分爲“實例變量”和“靜態變量”,其中“實例變量”是與個體有關的有關的變量比如圓的半徑,對於不同的圓來說,半徑是不同的。“靜態變量”也叫做“類變量”,是與類實例無關的變量,例如圓周率,對於不同的圓而言,圓周率的值是不變的。
靜態變量用static
修飾,同理,用static修飾的方法稱爲靜態方法。靜態方法可以訪問靜態變量和其他的靜態方法。
對靜態變量和靜態方法的調用有兩種方法:①通過類名調用,②通過類的實例調用
//first包內Circle.java文件
package first;
public class Circle{
protected int radius;
//靜態變量
public static float PI = 1415926f;
//默認構造
public Circle(){
radius = 1;
};
public Circle(int r) {
this.radius = r;
}
//靜態方法
public static void showPI() {
System.out.printf("PI is %f\n",PI);
}
}
//default包內的Draw.java 文件
import first.Circle;
public class Draw{
public static void main(String[] args) {
//通過類名調用靜態方法
Circle.showPI(); //輸出 PI is 3.141593
//通過類名調用靜態變量
System.out.println(Circle.PI); //輸出 3.1415925
//實例化一個Cricle 對象
Circle myCircle = new Circle(2);
//通過類的實例調用靜態變量
System.out.println(myCircle.PI); //輸出 3.1415925
//通過類的實例調用靜態方法
myCircle.showPI(); //輸出 PI is 3.141593
}
}
靜態代碼塊
上面我們對靜態變量PI
是在聲明的同時就賦值了。但有時靜態變量的值要經過計算才能得到,這時就要用到靜態代碼塊。靜態代碼塊只在第一次類加載時執行。
稍微修改上例代碼:
//first包中的Circle.java文件
package first;
public class Circle{
protected int radius;
public static float PI;
//默認構造
public Circle(){
radius = 1;
};
public Circle(int r) {
this.radius = r;
}
public void setRadius(int r) {
this.radius = r;
}
public int getRadius() {
return this.radius;
}
public float getArea() {
return PI*this.radius*this.radius;
}
public static void showPI() {
System.out.printf("PI is %f\n",PI);
}
//靜態代碼塊
static {
PI = 3.1415926f;
System.out.println("This is static code block...");
}
}
//default包中的Draw.java文件
import first.Circle;
public class Draw{
public static void main(String[] args) {
//通過類名調用靜態方法
Circle.showPI(); //此時第一次加載類,調用靜態代碼塊。
//通過類名調用靜態變量
System.out.println(Circle.PI);
//實例化一個Cricle 對象
Circle myCircle = new Circle(2);
//通過類的實例調用靜態變量
System.out.println(myCircle.PI);
//通過類的實例調用靜態方法
myCircle.showPI();
}
}
運行Draw.java文件,輸出:
This is static code block...
PI is 3.141593
3.1415925
3.1415925
PI is 3.141593