Java基礎學習筆記(九)—— java中的private,protected,public與靜態代碼塊

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()不可視
	}
}
默認級別

默認級別就是在聲明變量不加修飾詞,它的限制性介於privateprotected之間。默認級別的成員變量和方法,可以在其所在的類內部和同一個包的其他類中被直接訪問,但在不同的包的類中則不允許直接訪問

//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()語句;另一種是繼承,即子類繼承父類的成員變量和方法。

  1. 公有訪問級別任何情況下兩種方式都可以;
  2. 默認訪問級別在同一包中兩種訪問方式都可以,不能在包之外訪問;
  3. 保護訪問級別在同一包中與默認訪問級別一樣,兩種訪問方式都可以。但是在不同包之外只能繼承訪問;
  4. 私有訪問級別只能在本類中通過調用方法訪問,不能繼承訪問。

靜態變量和靜態方法

類中的變量可以分爲“實例變量”和“靜態變量”,其中“實例變量”是與個體有關的有關的變量比如圓的半徑,對於不同的圓來說,半徑是不同的。“靜態變量”也叫做“類變量”,是與類實例無關的變量,例如圓周率,對於不同的圓而言,圓周率的值是不變的。
靜態變量用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

- THE END -
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章