封裝:
1.目的:保證物件中的實體變數無法隨意修改/訪問,只能通過我們自己設定的入口,出口(set / get)來間接操作;屏蔽類中復雜的結構,使我們程式員在主方法中關聯物件寫代碼時,思路/代碼格式更加清晰;
2.操作:將某些屬性私有化(private修飾),再宣告相應的 set ,get 方法,這樣我們就可以通過 set / get 方法來 修改 / 訪問 相應的私有屬性了;
嘴上說不如舉栗子:
class tool{
private int a;
private String b;
private String c;
public tool() {
}
public tool(int a, String b, String c) {
this.a = a;
this.b = b;
this.c = c;
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
public String getC() {
return c;
}
public void setC(String c) {
this.c = c;
}
}
public class pra{
public static void main(String[] args) {
tool t1=new tool();
//創建tool型別參考t1,并呼叫無參構造方法為t1在堆記憶體指向的物件中的三個實體變數賦初始值
System.out.println(t1.getA()+t1.getB()+t1.getC()+"---第一次輸出結果");
//利用get方法訪問物件中的三個私有屬性
t1.setA(100);
t1.setB("是");
t1.setC("100");
//利用set方法修改物件中的三個私有屬性
System.out.println(t1.getA()+t1.getB()+t1.getC()+"---第二次輸出結果");
tool t2=new tool(100,"是","100");
//創建tool型別參考t2,并呼叫有參構造方法為t2在堆記憶體指向的物件中的三個實體變數賦值
System.out.println(t1.getA()+t1.getB()+t1.getC()+"---第三次輸出結果");
}
}
輸出結果:
0nullnull---第一次輸出結果
100是100---第二次輸出結果
100是100---第三次輸出結果
Process finished with exit code 0
靜態變數的使用(static):
1.什么時候選擇宣告靜態變數:
對于同一型別的所有物件來說,一直不變的屬性就宣告為靜態變數,就 類 中國人 來說,它其中的國籍屬性除了中國,還能是什么?所以當一個型別的物件中的一個屬性始終不變,或者說對于所有同型別的物件來說,此變數中儲存的資料 都應該是一樣的,這個時候我們就選擇宣告靜態變數;
2.為什么要在符合條件的前提下,盡量使用靜態變數:
還拿100個中國人舉例子吧,如果我們把國籍宣告為實體變數,那么我們創建 n 個中國人物件,就要在堆記憶體中占用 n 塊大小相同的空間來儲存同樣的資料 “ 中國 ”,在可以達到相同的效果的前提下,選擇占用記憶體大的代碼是程式員的大忌!而如果我們將國籍宣告為靜態變數,那么我們無論創建多少個中國人物件,都只會在方法區記憶體中占用一塊固定大小的記憶體空間來儲存“ 中國 ”,以此來節省記憶體,因為靜態變數不像實體變數那樣屬于“物件級別的變數”,它屬于類級別的變數,所以無論物件是否創建,都不影響用“ 類名 . ”的方式來訪問它,
輔助理解記憶體圖:
實體方法 / 靜態方法 的選擇:
easy,在已經知道什么時候宣告實體變數什么時候宣告靜態變數的前提下,方法體中需要實體變數的方法就宣告為實體方法,反之方法體中不需要訪問實體變數的方法就宣告為靜態方法;
代碼塊:
1.用途:代碼塊分為靜態代碼塊和實體代碼塊,靜態代碼塊執行時機---類加載時(優先于類體中的所有代碼);動態代碼塊執行時機---呼叫構造方法時(優先于方法體中的所有代碼),并且靜態代碼塊優先于實體代碼塊,所以我們可以通過輸出結果來判斷---什么時候哪個類體執行了 / 什么時候某個構造方法執行了;
2.格式及優先級順序展示:
public class pra{
static {
System.out.println("靜態代碼塊 a 執行了!");
}
{
System.out.println("實體代碼塊 a 執行了!");
}
public static void main(String[] args) {
pra t1=new pra();
}
public pra(){
System.out.println("無參構造方法 執行了!");
}
static {
System.out.println("靜態代碼塊 b 執行了!");
}
{
System.out.println("實體代碼塊 b 執行了!");
}
}
運行結果1(將創建 pra 物件代碼注釋掉)與運行結果2(取消注釋,還原為代碼):
靜態代碼塊 a 執行了!
靜態代碼塊 b 執行了!
Process finished with exit code 0 (結果一)
靜態代碼塊 a 執行了!
靜態代碼塊 b 執行了!
實體代碼塊 a 執行了!
實體代碼塊 b 執行了!
無參構造方法 執行了!
Process finished with exit code 0 (結果二)
隨筆:
1. public :啥都能訪問 ;private 只有在宣告它的類中可以訪問 ;
2.空指標例外問題:這個問題我感覺沒什么好說的,“ 參考 ”是一個儲存物件地址的變數,如果它里面什么地址也沒存(null),那在使用它時,就會出現空指標例外;
由于博主目前還沒有將 Java-SE 的知識都學完,所以有些地方可能說的有些片面,若前輩們能夠指點一二就更好了 (~ ̄(OO) ̄)ブ
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/351907.html
標籤:Java
