理解Java面向對象的重要知識點:
一、 類,對象
類?首先舉一個例子:小李設計了一張汽車設計圖,然后交給生產車間來生產汽車,有黑色的、紅色的、白色的... 這里,汽車設計圖就是我們說的類(class),生產車間就是new構造器(大部分對象都是new出來的),生產出來的汽車就是我們要說的對象。可以說java編程實質就是構建類的過程。
對象?萬物皆對象,宇宙中,如植物,動物,人類,每個個體都是各司其職、各盡所能的。這就要求對象高內聚、低耦合(簡單理解就是人的大腦,它負責思考,想象,記憶,而不能呼吸,排毒,消化食物,從而保證它獨立和高效)。對象具有兩種東西狀態(屬性)和行為(方法),請看下面代碼:
Student.java
public class Student { String name; //姓名 int age; //年齡 String classNo; //班級 String hobby; //愛好 //輸出信息方法 public void show(){ System.out.println(name + "\n年齡:" + age + "\n就讀於:" + classNo + "\n愛好:" + hobby); } }
InitialStudent.java
public class InitialStudent { public static void main(String args[]){ Student student = new Student(); //建立對象 student.name = "張浩"; //給對象賦值 student.age = 10; student.classNo = "S1班"; student.hobby = "籃球"; student.show(); //調用方法
} }
二、封裝,繼承,多態
封裝?舉個粗俗的比喻,我的移動硬盤存了很多各式各類的資料,但是舍友常常借用,時不時拿我的用(格式化?裝系統?存電影?),這就給我這個擁有者非常大的不便,我就跟他聲明,這個硬盤是我私有的,不能你得按照我允許的方式使用!對象也是這樣,不能隨意的存取內部數據,否則會造成“交叉感染”。所以我們需要封裝:將屬性私有化,提供公有的方法訪問私有屬性。
Adult.java
public class Adult { private int age; public int getAge() { return age; } public void setAge(int age) { if (age < 18) { System.out.println("錯誤!最小年齡應為18歲!"); this.age = 18; // 如果不符合年齡要求,則賦予默認值 } else{ this.age = age; } } public String toString() { return " [age=" + age + "]"; } }
TestAdult.java
public class TestAdult { public static void main(String[] args) { Adult p1 = new Adult(); p1.setAge(20); //通過seter、geter、toString來對Adult類的私有屬性訪問 System.out.println(p1.toString()); //增加了數據訪問限制,保證可維護性 } }
繼承?經理覺得小李設計的汽車設計圖非常棒,但是現在推崇新能源,於是需要將引擎改成電能發動機。於是小陳輕而易舉的將圖紙中汽油發動機部分改成引擎發動機,再重制一下關系就完成了新圖紙!這就是繼承的作用:是使用已存在的類的定義作為基礎建立新類,新的類可以擁有父類的特點,也可以衍生出更多的特點。這使得復用以前的代碼非常容易,能夠大大縮短開發時間。
Person.java
class Person { // 定義人類 public String mName; // 姓名 public int mAge; // 年齡 public void dining() { System.out.println("吃飽了..."); } // 吃飯的方法 } class Student extends Person { // 學生類繼承於人類 public float mGrade; // 成績 public void examination() { System.out.println("考試及格了..."); } // 考試的方法 } class Teacher extends Person { // 教師類繼承於人類 public float mSalary; // 薪水 public void prelection() { System.out.println("上課很累..."); } // 上課的方法 }
TestPerson.java
public class TestPerson { public static void main(String[] args) { Student std = new Student(); // 實例化學生對象 std.mName = "李東"; std.mAge = 18; // 為姓名和年齡賦值,訪問的是父類中的成員 std.dining(); // 調用吃飯的方法,訪問的是父類中的成員 std.examination(); // 調用考試方法,訪問的是子類中的成員 Teacher teacher = new Teacher(); // 實例化教師對象 teacher.mName = "趙忠祥"; teacher.mAge = 72;// 為姓名和年齡賦值,訪問的是父類中的成員 teacher.dining();// 調用吃飯的方法,訪問的是父類中的成員 teacher.prelection();// 調用考試方法,訪問的是子類中的成員 } }
多態?程序中定義的引用變量所指向的具體類型和通過該引用變量發出的方法調用在編程時並不確定,而是在程序運行期間才確定,即一個引用變量倒底會指向哪個類的實例對象,該引用變量發出的方法調用到底是哪個類中實現的方法,必須在由程序運行期間才能決定。因為在程序運行時才確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實現上,從而導致該引用調用的具體方法隨之改變,即不修改程序代碼就可以改變程序運行時所綁定的具體代碼,讓程序可以選擇多個運行狀態,這就是多態性。多態性增強了軟件的靈活性和擴展性。小李喜歡聽小鳥唱歌{麻雀,杜鵑,鸚鵡}
小李:窗外的鳥兒,給我唱首歌。
1.(鳥 bird = new 麻雀 )?
2.(鳥 bird = new 杜鵑 )?
3.(鳥 bird = new 鸚鵡 )?
鳥兒:bird.sing()~~~~~
小李:鳥兒唱的不錯,你是哪種鳥?
鳥兒: bird.shape()
小李:(---如果上面藍字定義的是3,是鸚鵡)哈哈!原來你是鸚鵡!
所以,多態的過程實質是一個抽象指令,讓一組具有相同行為單具有不同內容的個體協同工作的這樣的一個過程。
人無完人,但會完蛋,如有錯誤,懇請指出!
(本文原創,轉載請注明出處!)