一、封裝
定義:封裝就是將同一類事物的特性與功能包裝在一起,對外暴露調用的接口。
封裝可以可以被認爲是一個保護屏障,防止該類的代碼和數據被外部定義的代碼隨機訪問。並且封裝的主要功能在於我們能夠修改自己實現的代碼,而不用修改哪些調用我們代碼的程序片段。
適當的封裝可以讓我們的代碼更容易理解和維護,也加強了代碼的安全性。
封裝的優點:
1)解耦
2)類內部的結構可以自由修改
3)對成員變量進行 更精確的控制
4)隱藏信息,實現細節。
封裝的實現步驟:
==》修改屬性的可見性(設爲private)
==》創建getter/setter方法(用於屬性的讀寫)
==》在getter/setter方法中加入屬性控制語句(對屬性值進行合法性的判斷)
package EncapsulationDemo;/*
* @author :James
* @date :2020/6/28 14:56
* @Email :[email protected]
* Version :V1.0
* @Function :
*/
public class People {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
if (name.length()>10){
System.out.println("長度過長,請重新輸入");
}else{
this.name = name;
}
}
}
運行結果:
二、繼承
概念:繼承是子類繼承父類的特徵和行爲,使得子類對象(實例)具有和父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行爲
生活中的繼承:
上圖繼承關係可以瞭解到:動物屬於父類(或者說基類或超類),食草動物和食肉動物分別是動物的子類(或者說是派生類)。而食草動物和食肉動物分別是子類(派生類)兔子和羊。老虎和獅子的父類。
繼承特點:
1)子類可以擁有父類的內容:(都有名稱,有五官等等)。
2)子類可以擁有自己專有的內容。(食草動物喫草,就是食草動物專有的內容,食肉動物喫肉,就屬於食肉動物專有的內容)
繼承的特性
1)子類擁有父類非private的屬性、方法
2)子類可以擁有自己的屬性和方法,也就是說子類可以對父類進行擴展
3)子類用自己的方式實現父類的方法
4)繼承是單繼承,也可以是多重繼承,但是不能是多繼承
5)提高了類的耦合性
關於單繼承、多級繼承圖示:
在繼承關係中,如果成員變量重名,則在創建子類對象的時候,有兩種訪問方式。
1)直接通過子類對象訪問成員變量(等號左邊是誰,就優先用誰,沒有則向上找)
2)間接通過成員方法訪問成員變量(該方法屬於誰,就優先用誰,沒有則向上找)
如何區分子類方法中重名的三種變量?
--》局部變量:直接寫成員變量名
--》本類中的成員變量:this.成員變量名
--》父類中的成員變量名:super.成員變量名
【詳細例子參照下面的代碼:】
繼承關鍵字:Java中使用extends和implements來實現繼承,前者多用於類與類之間後者用於類與接口之間的繼承。
public class Fu {
String father="Father";
int num=12;
public void methodFu(){
System.out.println("我是父類的方法");
}
}
public class Zi extends Fu{
String son="Son";
int num=345;
public void methodZi(){
int num=123;
System.out.println("我是子類方法");
System.out.println(this.num ); //輸出結果:345
System.out.println(super.num ); //輸出結果:12
System.out.println(num ); //輸出結果:10
}
}
public class DemoExtends {
public static void main(String[] args) {
Zi zi=new Zi();
zi.methodZi(); //輸出結果:這是子類的方法
zi.methodFu(); //輸出結果:這是父類的方法
System.out.println(zi.son); //輸出結果:Son
System.out.println(zi.father);//輸出結果:Father
System.out.println(zi.num); //輸出結果:34535
}
}
關於成員變量、局部變量和類變量:
類變量(靜態變量):用static修飾的變量成爲靜態變量,其內容被該類所有對象共享,所有對象中的這個類變量的值都指向相同的一處內存,隨便一個對象修改了此處內存的值都會影響其他對象。
成員變量:定義在方法外部,直接寫在類當中,整個類都可以調用,如果沒有賦值則會有一個默認值,規則和數組一樣,成員變量位於堆內存當中。成員變量隨着對象的創建而誕生,隨着對象的回收而消失
局部變量:定義在方法內部,只有方法中才可以調用,除了方法就不能調用了,局部變量沒有默認值,如果想要使用,必須手動進行賦值,其位於棧內存當中。局部變量隨着方法進棧而誕生,隨着方法出棧而消失 。
關於繼承過程中的重寫:
重寫(override):方法名稱一樣,參數列表也一樣。
重載(overload):方法名稱一樣,參數列表不一樣。
注意事項:
1)必須保證父子類之間的方法的名稱相同,參數列表也相同,@override:寫在方法前面,用來檢測是不是有效的正確覆蓋重寫,
2)子類方法的返回值必須【小於等於】父類方法的返回值範圍。
3)子類方法的權限必須【大於等於】父類方法的權限修飾符。
重寫應用場景:
public class Fu {
String father="Father";
int num=12;
public void methodFu(){
System.out.println("我是父類的方法");
}
}
public class Zi extends Fu{
@Override
public void methodFu() {
System.out.println("覆蓋了父類的方法");
}
}
public class DemoExtends {
public static void main(String[] args) {
Zi zi=new Zi();
zi.methodFu(); //輸出結果:覆蓋了父類的方法
}
}
三、多態
多態是同一個行爲具有多個不同的表現形式或者形態的能力。多態存在的三個必要條件:
1)繼承 2)重寫 3)父類引用指向子類對象
多態的優點:
1)消除類型之間的耦合關係 2)可替換性 3)接口性
4)靈活性 5)簡化性 6)可擴充性
多態實例:
--》接口
public interface InterfaceUSB {
public abstract void powerOn();
public abstract void powerOff();
}
--》兩個實現類
public class KeypressInterface implements InterfaceUSB{
@Override
public void powerOn() {
System.out.println("鍵盤已連接");
}
@Override
public void powerOff() {
System.out.println("鍵盤已斷開");
}
public void type(){
System.out.println("鍵盤輸入");
}
}
public class MouseInterface implements InterfaceUSB{
@Override
public void powerOn() {
System.out.println("連接鼠標");
}
@Override
public void powerOff() {
System.out.println("關閉鼠標");
}
public void click (){
System.out.println("鼠標點擊");
}
}
--》主體代碼
public class Computer {
public void powerOn() {
System.out.println("開機已就緒");
}
public void powerOff() {
System.out.println("已關機");
}
//使用USB設備方法,使用接口作爲方法的參數
public void useDevice(InterfaceUSB interfaceUSB) {
interfaceUSB.powerOn();
if (interfaceUSB instanceof MouseInterface) { // 一定要先判斷
MouseInterface mouse = (MouseInterface) interfaceUSB; // 向下轉型
mouse.click();
} else if (interfaceUSB instanceof KeypressInterface) { // 先判斷
KeypressInterface keyboard = (KeypressInterface) interfaceUSB; // 向下轉型
keyboard.type();
}
interfaceUSB.powerOff();
}
}
public class ComputerMain {
public static void main(String[] args) {
//創建一個筆記本電腦
Computer computer=new Computer();
computer.powerOn();
//準備一個鼠標供電腦使用
MouseInterface mouseInterface=new MouseInterface();
computer.useDevice(mouseInterface);
//創建一個USB鍵盤
KeypressInterface keypressInterface=new KeypressInterface();
computer.useDevice(keypressInterface);
computer.powerOff();
}
}
運行結果:
此多態例子中,KeypressInterface和Mouseinterface實現了InterfaceUSB接口,並且除了實現了powerOn和powerOff方法外還都有各自的方法【keypressInterface的鍵入方法,MouseInterface的點擊方法】,並且在代碼中又出現了兩個新的知識點,對象的向上轉型和向下轉型
對象的向上、向下轉型
1)對象的向上轉型,其實就是多態的寫法
格式:父類名稱 對象名=new 子類名稱 (); InterfaceUSB interfaceMouse=new MouseInterface();
含義:右側創建一個子類對象,把它當做父類來看待使用 【上面代碼:創建一個鼠標當接口使用】
2)對象的向下轉型,實際則爲一個【還原】的動作
注意:【向下轉型,需要使用instanceof進行判斷,防止出現ClassCastException(類轉換異常)錯誤】
格式:子類名稱 對象名=(子類名稱)父類對象;含義:將父類對象,【還原】成爲本來的子類對象
參考鏈接:
https://www.cnblogs.com/hysum/p/7100874.html