Java學習筆記9(物件導向二),java學習筆記
就近原則:
類中的方法中的變數和成員變數重名時,調用類的方法時候,生效的是方法中的變數,如果方法中沒有定義變數,才會去成員變數中尋找
於是,提出了this關鍵字,為了區分重名問題
public class Person { // 人的姓名年齡,成員變數 private String name; private int age; public void setAge(int a) { if (a < 0 || a > 100) { age = 20; } else { age = a; } } public void setName(String n){ name = n; } //定義方法,擷取age public int getAge(){ return age; } public String getName(){ return name; } // 說話功能 public void speak() { String name = "李四"; int age = 16; System.out.println(this.age + "歲的" + this.name + "在說話"); }}
public class PersonTest { public static void main(String[] args) { Person p = new Person(); p.setName("張三"); p.setAge(80); System.out.println(p.getAge()); System.out.println(p.getName()); p.speak(); }}
這裡如果不寫this,輸出的就是李四,如果寫了則輸入張三
注意this是調用者本身的對象
this記憶體分析:
1.main進棧運行,堆中開空間存入Person對象,成員變數跟隨並賦預設值
2.p調用speak方法時,speak進棧執行,調用者是p對象,this就是p對象本身,因此p將對象地址傳遞給this,於是this也指向這一片記憶體空間
於是我們發現,剛才的Person類這樣寫會更規範:
public class Person { private String name; private int age; public void setAge(int a) { if (a < 0 || a > 100) { this.age = 20; } else { this.age = a; } } public void setName(String n) { this.name = n; } public int getAge() { return age; } public String getName() { return name; } public void speak() { String name = "李四"; int age = 16; System.out.println(this.age + "歲的" + this.name + "在說話"); }}
繼承:
類的繼承是指在一個現有類的基礎上去構建一個新的類,構建出來的新類被稱作子類,現有類被稱作父類
子類會自動擁有父類所有可繼承的屬性和方法
舉例:
public class Employee { String name; public void work(){ System.out.println("員工"+name+"在工作"); }}
public class Develop extends Employee{ public void print(){ System.out.println(name); }}
public class Test { public static void main(String[] args) { Develop d = new Develop(); d.name = "張三"; d.print(); d.work(); }}
繼承的特點和優點在這個例子中都體現出了
1.提高代碼的複用性,提升開發效率
2.繼承的出現讓類與類之間產生了關係,提供了多態的前提
注意事項:
java只支援單繼承,不支援多繼承,因為有安全隱患,例如兩個父類有重名方法時
可以使用連續繼承(多重繼承)實現多繼承,這種方式合法
成員變數的變化:
子類定義的變數如果和父類重名,調用子類的時候,以子類的變數為準,如果子類不存在這個變數,則去父類中尋找,但是有一個super關鍵詞可以指定在父類中尋找
public class Fu { int i = 1;}
public class Zi extends Fu { int i = 2; public void show(){ System.out.println(super.i); }}
public class Test { public static void main(String[] args) { Zi z = new Zi(); z.show(); }}
這時候的輸出結果為1,關於super的知識在後面詳寫
子類重寫父類方法:
子類中,出現了和父類一樣的方法的時候,稱為子類重寫父類的方法
用super.調用父類的功能,再寫入新的功能
注意:子類如果要覆蓋父類方法,必須要保證許可權大於或等於父類許可權(public>protected>default>private)
抽象類別:
只有聲明,沒有定義
抽象方法必須存在於抽象類別中
抽象類別,不能執行個體化對象(不能使用new)因為抽象類別沒有主體,無法運行
抽象類別的使用:必須定義類繼承它,將抽象方法重寫,建立它的子類的對象,並且強制讓子類重寫方法
public abstract class Person { public abstract void work();}
public class Teacher extends Person { public void work() { System.out.println("老師在工作"); }}
public class Engineer extends Person { public void work() { System.out.println("工程師在工作"); }}
public class Test { public static void main(String[] args) { Teacher t = new Teacher(); Engineer e = new Engineer(); t.work(); e.work(); }}
輸出:
老師在工作
工程師在工作
抽象類別主要是為了學習它的設計思想:
抽象類別的作用:繼承的體系
抽象類別強制子類重寫抽象方法,保證體系功能的完整性
抽象類別的一些注意事項:
1.有抽象方法的一定是抽象類別,抽象類別不止有抽象方法
2.抽象關鍵字abstract不可以共存的:private,final,static
3.抽象類別必須是父類