說到面向對象三大特性之前,先概述一下什麼是面向對象
面向對象簡單來說就是一種程序設計思想,我們在面向對象思想的指引下, 使用Java語言去設計、開發計算機程序。 這裏的對象泛指現實中一切事物,每種事物都具備自己的屬性和行爲。
要注意這種思想強調的是對象,讓別人幫我們幹活,能幫我們幹活的就稱爲對象.
現實世界的一類事物: 屬性:事物的狀態信息。 行爲:事物能夠做什麼。 Java中用class描述事物也是如此: 成員變量:對應事物的屬性 成員方法:對應事物的行爲
簡述後,現在來說說面向對象的三大特性.
特性一 封裝
什麼是封裝? 封裝就是使用private關鍵字將隱私的內容隱藏起來,不讓外界直接使用
封裝的原則: 1. 將隱私的內容私有
2. 被private修飾後的成員變量和成員方法,只在本類中才能訪問
3. 提供get/set方法給別人使用
封裝的好處: 提高代碼的安全性
class Demo {
// 比如定義一個妹子的屬性
String name;
//像這個妹子的年齡不想給別人直接看到,用private私有,外界就不能直接使用了
private int age;
//要給外界使用提供set/get方法
//提供設置age的方法
public void setAge(int age) {
this.age = age;
}
// 提供獲取age的方法
public int getAge() {
return age;
}
//定義一個私有方法
static private void method(){
System.out.println("這是一個靜態的私有方法");
}
static void method1(){
//私有方法只有本類才能訪問,外界訪問不到
method();
}
}
特性二 繼承
什麼是繼承? 繼承就是在現有類的基礎上定義一個新的類,現有類稱爲父類,新的類稱爲子類,,子類對象具有與父類相同的屬性、相同的行爲。子類可以直接訪問父類中的非私有的屬性和行爲.
繼承的格式
class 類名 extends 父類名 {
}
和普通類相比:在類名後面多了extends 父類名. extends關鍵字表示繼承.
構造方法子類不會繼承
因爲構造方法名和類名一致,父類和子類類名肯定不一樣,所以父類的構造方法複製到子類中肯定用不了了:
什麼時候使用方法重寫:
子類和父類相同的功能,但是子類的功能比父類的功能更加強大,就使用方法的重寫
方法重寫注意事項:
1.是子類和父類之間的事情
2.方法名要相同
3.參數列表要相同
4.返回值類型要相同
5.子類方法的權限要大於等於父類方法的權限
繼承的好處: 1. 子類會自動擁有父類的內容,提高代碼的複用性
2. 類與類之間產生了關係,是多態的前提
class Person {
//定義父類成員變量
String name;
private int age;
//無參構造和有參構造
public Person() { }
public Person(String name, int age) { this.name = name;this.age = age; }
//定義成員方法
public void eat() {System.out.println("吃飯"); }
//提供set/get方法
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
//定義一個子類繼承Person
class Student extends Person {
//構造方法不能被繼承,類名不同
public Student() { }
public Student(String name, int age) { super(name, age); }
//同名方法需要重寫
public void eat(){ System.out.println(name + getAge() + "吃不起飯"); }
}
特性三 多態
多態: 是指同一行爲,具有多個不同表現形式
多態的前提:
1 繼承或者實現【二選一】
2 方法的重寫【意義體現:不重寫,無意義】
3 父類引用指向子類對象【格式體現】
多態的格式(重點): 父類引用變量指向子類對象
父類 變量名 = new 子類();
接口 變量名 = new 實現類();
多態的弊端:
當使用多態方式調用方法時,多態只能調用父類中的方法,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,執行的是子類重寫 後方法
多態的好處:
參數寫父類,可以傳入任意子類,多態規定,執行的是子類重寫的方法,提高代碼的擴展性 .
class Demo {
public static void main(String[] args) {
Student s = new Student();
Teacher t = new Teacher();
//調用方法,參數在傳遞過程中就使用了多態
kaiFan(s); //Person o = s; Person o = new Student();
kaiFan(t); //Person o = t; Person o = new Teacher();
}
//定義一個開飯的方法 //參數寫父類,可以傳入任意子類,提高代碼的擴展性
public static void kaiFan(Person o) { o.eat(); }
}
class Person {
public void eat() { System.out.println("吃飯"); }
}
class Student extends Person {
public void eat() { System.out.println("學生三菜一湯..."); }
}
class Teacher extends Person {
public void eat() { System.out.println("老師醬油拌飯..."); }
}