java學習-面向物件的三個特徵
1. 封裝
概念:隱藏物件內部的實現細節,控制物件中屬性的訪問和修改許可權。
訪問修飾符: private
(僅本類可見)
class FengZhuang {
private int age;
public int getAge() {
return this.age;
}
public void setAge(int val) {
if(val > 0 && val < 120) {
this.age = val
} else {
this.age = 18
}
}
}
隱藏類內部實現過程
設定屬性值時,可以有效的過濾無用值
2. 類的繼承
-
子類可以使用父類中的屬性和方法,子類也可以定義自己的屬性和方法。
-
既可以提高程式碼的複用性,也可以提高程式碼的可擴充套件性。
-
java是單繼承,一個類只能有一個父類,但是可以多級繼承。屬性和方法也會逐級疊加。
子級如何訪問爺爺級的重用的屬性和方法呢
不可繼承:
-
構造方法:只負責建立本類,不可繼承。
-
構造方法的特點:名稱與類名相同,且不能寫型別
class Test {
public Test() {...}
// public void Test() {...} 錯誤
}
-
-
訪問修飾符:
private修飾的屬性和方法僅本類可見;default僅同包父子類可見;
父子類中方法的重寫和覆蓋:
當父類中提供的方法無法滿足子類的需求時,可在子類中定義與父類相同的方法進行重寫。
-
重寫原則:方法名稱、引數列表、返回值型別必須與父類相同;訪問修飾符可等於或比父類更寬泛。(否則可能會報錯)
public class TestExtends {
public static void main(String[] args) {
B b = new B();
b.upload();
}
}
class A {
public void upload() {
System.out.println("print function in A");
}
}
class B extends A {
public void upload() {
System.out.println("print function in B");
}
}如果想在子類中訪問父類的方法或屬性(包括被重寫的),可以使用
super.
的形式。
繼承的物件構建過程:
super、建構函式和this:
-
super與this訪問屬性
class A {
int a = 1;
}
class B {
int a = 2;
public void print() {
int a = 3;
System.out.println(a); // 3
System.out.println(this.a); // 2 (this.訪問本類的屬性和方法)
System.out.println(super.a); // 1 (super.訪問父類的屬性和方法)
}
} -
super和建構函式
class AS {
public AS() {
System.out.println("AS");
}
public AS(int age) {
System.out.print("AS-");
System.out.print(age);
System.out.println();
}
}
class BS extends AS {
public BS() {
super();
System.out.println("BS");
}
public BS(int age) {
super(age + 1);
System.out.print("BS-");
System.out.print(age);
System.out.println();
}
}-
在建構函式中通過
super()
呼叫父類的構造方法(通過傳參或不傳參可以控制執行AS的哪一個構造方法) -
super或this如果使用在建構函式中,必須放在首行;
-
子類中如果使用了this()/this(實參)就不能在呼叫super。(在建構函式中呼叫this()會報
遞迴呼叫
的錯,那什麼情況下可以呼叫) -
在子類建構函式中如果沒有呼叫
super
,則預設執行super();
-
3. 多型
概念:父類引用指向子類物件,從而產生多種形態。
Animal a = new Dog()
// 引用型別------物件型別
Animal和Dog要有直接或者間接的繼承關係。
父類引用僅可以呼叫父類所宣告的屬性和方法,不可呼叫子類獨有的屬性和方法 。
多型的作用:
-
遮蔽子類間的差異。
-
靈活、耦合度低。
多型中方法的重寫
-
實際執行過程中依舊遵循重寫原則。既
amt.fn()
的執行結果BMT中方法的執行結果 -
子類中獨有的方法不能在父類引用物件中呼叫。既
amt.fnB()
會報錯。
class MultiType {
public MultiType() {
AMT amt = new BMT();
amt.fn(); // fn in BMT
// amt.fnB(); // 或報錯
}
}
class AMT {
public void fn() {
System.out.println("fn in AMT");
}
}
class BMT extends AMT {
public void fn() {
System.out.println("fn in BMT");
}
public void fnB() {
System.out.println("fn in BMT only");
}
}
應用場景:
-
使用父類作為方法形參實現多型,使方法的引數型別更為寬泛。
-
使用父類作為方法返回值實現多型,使方法可以返回不同子類物件。
-
向上轉型(裝箱)
-
向下轉型(拆箱)
-
向下轉型中的異常
-
instanceof