JAVA面向物件第三課封裝和繼承
封裝和繼承
封裝
根據對屬性的封裝來說明)吧對成員變數進行私有化,通過一個公共的方法間接的實現了訪問.
優點在於:
getter和setter方法
set 指的是賦值的過程
程式碼構成
修飾詞 返回值型別 方法名(引數類表){
方法體;
返回值
}
//返回值型別: 不需要--void
//方法名:set+成員變數的名字,但是成員變數的首字母需要大寫
//引數列表:一個方法完成對一個屬性的賦值,所以只需要一個引數.引數的型別與成員變數一直,引數的名字與成員變數一致
get 取值的過程
程式碼構成
修飾詞 返回值型別 方法名(引數類表){ 方法體; 返回值 } //返回值型別: 型別與成員變數一致 //方法名:get+成員變數的名字,但是成員變數的首字母需要大寫 //引數列表:不需要引數 //方法體:return成員變數
繼承
定義:有兩個類:A類與B類,當兩個類之間產生父子關係的時候,我們稱為繼承
功能:
簡化程式碼,方便操作,提高程式碼的複用性,提高了安全性,增加了程式碼的健壯性,使類與類之間產生了整合的關係,是多型的前提
class Phone{ String color; int model; public void callPhone() { System.out.println("打電話"); } } //建立iphone類 class IPhone extends Phone{ String gui; public void fangshui() { System.out.println("防水"); } } //建立華為類 class HUAWEI extends Phone{ public void nv() { System.out.println("牛逼"); } }
注意點:
super只能出現在子類的方法和構造方法中
super呼叫構造方法時,只能是第一句
super不能訪問父類的private成員
原理
首先由引用找到當前的子類物件,在當前的物件裡找到這個方法,找到了,直接呼叫,如果沒有,再去父類中找,找到了呼叫,找不到再繼續向上找,一直找到Object,如果還是沒有找到,說明沒有這個方法
重寫
super關鍵字
class Phone{ String color; int model; public void callPhone() { System.out.println("打電話"); } } //建立iphone類 class IPhone extends Phone{ String gui; public void callPhone() { //this.callPhone;//調到的是本物件的callPhone方法---死迴圈 super.callPhone();//直接呼叫的是父類的方法 System.out.println("有自己特有的功能!"); } }
在繼承中使用構造方法
1、當一個子類中只有一個帶有引數的構造方法,只能使用帶引數的,不能使用無參的,如果想使用,必須手動建立無參的構造方法
2、當父類中只有帶引數的構造方法,子類的構造方法中就必須在第一行手動呼叫父類帶引數的構造方法(super(引數))
3、當我們創造構造方法的時候,如果自己不寫super(),系統會自動呼叫
-原因:
父類中也有屬性要進行初始化,而物件的屬性必須由自己的構造方法進行初始化,所以必須呼叫super(),所以每個構造方法中都有一個super()
this和super的比較:
this是一種引用資料型別,代表當前的物件,儲存吧的是當前物件的地址
super:不是一種引用資料型別,可以通過super呼叫父類的成員.
包的使用
好處
1、類似於檔案系統的資料夾,可以實現分類管理類檔案,方便查詢
2、解決了同一個專案中同名類的衝突問題
包的建立
命名規範:
建議小寫字母,並且採用域名倒置的寫法
域名倒置:com.baidu
www.baidu.com
www.atguigu.com
建議寫法:
com.公司名.部門名.專案名.業務模組名;
com.專案名.業務模組名;
com.atguigu.業務模組名;
包的使用
1、package關鍵字
①如果某類存在於指定包下,則要求類的最上方必須新增包的宣告語句,語法如下:
package 包名;
②包的宣告語句在一個類中只可能出現一次
③位置:最上面
2、import關鍵字
① 跨包訪問某類,必須要求匯入該類所在的包&&該類具有跨包訪問許可權
語法:
import 包名.類名;
import 包名.*;
② 匯入包的語句在一個類中可以出現多次,沒有順序要求
③ 位置:package——import——class
④ 如果想訪問多個包中的同名類,則要注意不能直接類上方新增import導包語句,否則有歧義,可以使用全類名限定的方式
static方法
static表示“全域性”或者“靜態”的意思,用來修飾成員變數和成員方法,也可以形成靜態static程式碼塊,但是Java語言中沒有全域性變數的概念。
被static修飾的成員變數和成員方法獨立於該類的任何物件。也就是說,它不依賴類特定的例項,被類的所有例項共享。只要這個類被載入,Java虛擬機器就能根據類名在執行時資料區或者方法區內找到他們。因此,static物件可以在它的任何物件建立之前訪問,無需引用任何物件。
用public修飾的static成員變數和成員方法本質是全域性變數和全域性方法,當宣告它類的物件時,不生成static變數的副本,而是類的所有例項共享同一個static變數。
static變數前可以有private修飾,表示這個變數可以在類的靜態程式碼塊中,或者類的其他靜態成員方法中使用(當然也可以在非靜態成員方法中使用),但是不能在其他類中通過類名來直接引用,這一點很重要。實際上你需要搞明白,private是訪問許可權限定,static表示不要例項化就可以使用,這樣就容易理解多了。static前面加上其它訪問許可權關鍵字的效果也以此類推。
static修飾的成員變數和成員方法習慣上稱為靜態變數和靜態方法,可以直接通過類名來訪問,訪問語法為:
類名.靜態方法名(引數列表…)
類名.靜態變數名
用static修飾的程式碼塊表示靜態程式碼塊,當Java虛擬機器(JVM)載入類時,就會執行該程式碼塊(用處非常大)。
static變數
按照是否靜態的對類成員變數進行分類可分兩種:一種是被static修飾的變數,叫靜態變數或類變數;另一種是沒有被static修飾的變數,叫例項變數。兩者的區別是:
對於靜態變數在記憶體中只有一個拷貝(節省記憶體),JVM只為靜態分配一次記憶體,在載入類的過程中完成靜態變數的記憶體分配,可用類名直接訪問(方便),當然也可以通過物件來訪問(但是這是不推薦的)。
對於例項變數,每建立一個例項,就會為例項變數分配一次記憶體,例項變數可以在記憶體中有多個拷貝,互不影響(靈活)。
靜態方法
靜態方法可以直接通過類名呼叫,任何的例項也都可以呼叫,因此靜態方法中不能用this和super關鍵字,不能直接訪問所屬類的例項變數和例項方法(就是不帶static的成員變數和成員方法),只能訪問所屬類的靜態成員變數和成員方法。因為例項成員與特定的物件關聯!
因為static方法獨立於任何例項,因此static方法必須被實現,而不能是抽象的abstract。
static程式碼塊
static程式碼塊也叫靜態程式碼塊,是在類中獨立於類成員的static語句塊,可以有多個,位置可以隨便放,它不在任何的方法體內,JVM載入類時會執行這些靜態的程式碼塊,如果static程式碼塊有多個,JVM將按照它們在類中出現的先後順序依次執行它們,每個程式碼塊只會被執行一次。
例如:
package staticPackage;
public class testStatic {
private static int a;// 靜態變數
private int b;// 例項變數
static {
testStatic.a = 3;
System.out.println(a);
testStatic t = new testStatic();
t.f();
t.b = 1000;
System.out.println(t.b);
}
static {
testStatic.a = 4;
System.out.println(a);
}
public static void main(String[] args) {
// TODO 自動生成方法存根
}
static {
testStatic.a = 5;
System.out.println(a);
}
public void f() {
System.out.println("method f() executing...");
}
/**
* 3
* method f() executing...
* 1000
* 4
* 5
*/
}
利用靜態程式碼塊可以對一些static變數進行賦值,最後再看一眼這些例子,有一個static的main方法,這樣JVM在執行main方法的時候可以直接呼叫而不用建立例項。這時候我們去看為什麼要寫public static void main(String[] args)那篇文章應該也好理解了吧。
今天的分享就到這裡,謝謝!