5、Java中的物件導向(1)筆記,java物件導向
1、物件導向 VS 面向過程
1 /* 2 * 理解一:人開門 3 * 面向過程:人 開啟門 4 * 物件導向: 5 * 人{ 6 * 開啟(){ 7 * 門。開開(); 8 * } 9 * }10 * 門{11 * 開開(){12 * }13 * }14 * 15 * 理解二:人把大象裝進冰箱16 * 面向過程:17 * 1、開啟冰箱;18 * 2、把大象放進去;19 * 3、關閉冰箱門;20 * 物件導向:21 * 人{22 * 開啟(冰箱){冰箱.開開()}23 * 操作(大象){大象。進入(冰箱)}24 * 關閉(冰箱){冰箱。合上()}25 * }26 * 大象{27 * 進入(冰箱){}28 * }29 * 冰箱{30 * 開開(){}31 * 合上(){}32 * }33 */
2、物件導向的編程關注於類的設計!
2.1、一個項目或者工程不管多龐大一定是有一個一個的類構成的。
2.2、類是抽象的,好比是製造汽車的圖紙。而具體的一輛一輛的車,是根據圖紙製造的,實際上就是類的執行個體化
1 /* 2 * 1、物件導向的編程關注於類的設計 3 * 2、設計類實際上就是設計類的成員 4 * 3、基本的類的成員,屬性(成員變數或Field)&方法(Method) 5 */ 6 public class TestPerson { 7 public static void main(String[] args) { 8 Person p1 = new Person(); 9 p1.info();10 11 p1.name = "鐘超";12 p1.age = 21;13 p1.sex = true;14 p1.info();15 16 p1.setName("張三");//p1.name = "張三"17 p1.info();18 19 Person p2 = p1;20 System.out.println("P1:" + p1);21 System.out.println("P2:" + p2);22 p2.info();23 24 p2 = new Person();25 System.out.println("P2:" + p2);26 p2.info();27 //執行個體化Scanner類的對象,通過此對象.nextXxx的方法進行調用,完成相應的功能;28 Scanner s = new Scanner(System.in);29 int i = s.nextInt();30 31 Person p3 = new Person();32 p3.info();33 }34 }35 //類:是抽象的。36 class Person{37 //1.屬性38 String name;39 int age = 10;40 boolean sex;41 42 //2.方法43 public void eat(){44 System.out.println("人吃飯");45 }46 public void sleep(){47 System.out.println("人睡覺");48 }49 50 public String getName(){51 return name;52 }53 public void setName(String n){54 name = n;55 }56 57 public void info(){58 // eat();59 // sleep();60 System.out.println("name:" + name + "age:" + age + "sex:" + sex);61 }62 }
3、完成一個項目(或功能)的思路
3.1、所要完成的功能對應的類的對象是否存在;
3.2、若存在,則通過對象直接調用對應的類中的屬性或方法即可;
3.3、若不存在,需要建立類的對象。甚至說,類都不存在就需要設計類;
4、物件導向編程的三條主線:
1、類以及類的構成成分:屬性 方法 構造器 代碼塊 內部類
2、物件導向編程的特徵:封裝性 繼承性 多態性 (抽象性)
3、其他的關鍵字:this super package import static final abstract interface...
類:
1、關注於類的設計
2、類的組成成分:
1、屬性(成員變數,Field)
2、方法(成員方法,函數,Method)
3、關於屬性:
4、方法:
1 /* 2 * 一、物件導向思想的落地法則一: 3 * 1.設計類並設計類的成員(成員變數&方法) 4 * 2.通過類來建立類的對象(也稱作類的執行個體化) 5 * 3、通過“對象。屬性”或“對象。方法”來調用,完成相應的功能 6 * 7 * 二、建立的多個對象,彼此各自擁有一套類的屬性,當對其中一個對象的屬性進行修改時。 8 * 不會影響到其他對象的屬性值。 9 * 10 * 三、類的屬性(成員變數) 11 * 成員變數 VS 局部變數 12 * 相同點:1、遵循變數聲明的格式;資料類型 變數名 = 初始化值; 13 * 2、都有範圍: 14 * 不同點:1、聲明的位置的不同:成員變數:生命在類裡,方法外邊; 15 * 局部變數:聲明在方法內,方法的形參部分,代碼塊內 16 * 2、成員變數的修飾符有四個:public(公用的) private(私人的) protected 預設 17 * 局部變數沒有修飾符:與所在的方法的修飾符一樣; 18 * 3、初始化值:一定會有初始化值; 19 * 成員變數:如果在聲明的時候,不顯示的賦值,那麼不同的資料類型會有不同的預設初始化值; 20 * byte short int long = 0; 21 * float double = 0。0; 22 * char = 空格; 23 * boolean = false; 24 * 引用類似的變數 = null; 25 * 局部變數:一定要顯示的賦值(局部變數沒有預設初始化值); 26 * 4、二者在記憶體中存放的位置不同,成員變數在堆空間中,局部變數在棧空間中; 27 * 總結:關於變數的分類:1、按照資料類型的不同:基礎資料型別 (Elementary Data Type)(8種)&引用資料類型 28 * 2、按照聲明位置的不同::成員變數&局部變數 29 * 30 * 四、類的方法:提供某種功能的實現 31 * 1、執行個體 public void eat(){方法體} 32 * public String getName(){} 33 * public void setName(String n){} 34 * 2、格式:許可權修飾符 傳回值類型(void:無傳回值/具體傳回值) 方法名(形參){} 35 * 3、關於傳回值類型 void:表名此方法不需要傳回值 36 * 有傳回值的:在方法的最後一定有return + 傳回值類型對應的變數 37 * 記憶:void與return不可以同時出現在一個方法內。 38 * 4、方法內可以調用本類的其他方法和屬性,但是不能再方法內在定義其他方法; 39 * 40 * ClassRoom Car ... 41 */ 42 public class Zoo { 43 public static void main(String[] args) { 44 //基礎資料型別 (Elementary Data Type)的聲明:資料類型 變數名 = 初始化值; 45 int i = 10; 46 //1.類的執行個體化:如下的a1就是一個實實在在的對象 47 Animal a1 = new Animal(); 48 //int[] arr = new int[10]; 49 //通過對象調用屬性 50 a1.name = "花花"; 51 a1.age = 3; 52 System.out.println("name:" + a1.name + "\t" + "age:" + a1.age); 53 //通過對象調用方法 54 a1.eat(); 55 a1.sleep(); 56 57 //在建立一個對象 58 Animal a2 = new Animal(); 59 System.out.println("name:" + a2.name + "\t" + "age:" + a2.age); 60 a2.name = "小花"; 61 System.out.println("name:" + a1.name + "\t" + "age:" + a1.age); 62 System.out.println("name:" + a2.name + "\t" + "age:" + a2.age); 63 //a3與a1一樣,a3不意味著相較於a1重新建立的一個對象,而是a1與a3共用一個對象實體 64 Animal a3 = a1; 65 System.out.println("name:" + a3.name + "\t" + "age:" + a3.age); 66 a3.name = "維尼熊"; 67 System.out.println("name:" + a1.name + "\t" + "age:" + a1.age); 68 69 System.out.println(a2.getName()); 70 System.out.println(a2.desc()); 71 } 72 } 73 74 class Animal{ 75 //1.屬性 76 String name; 77 int age; 78 //2.方法 79 public void eat(){ 80 System.out.println("動物進食"); 81 } 82 public void sleep(){ 83 System.out.println("動物休眠"); 84 //return; 85 } 86 public String getName(){ 87 return name; 88 } 89 public int getAge(){ 90 return age; 91 //其後不可以聲明語句 92 //System.out.println("Hello"); 93 } 94 //當通過對象調用此方法是,會將方法的傳回值提供給方法的調用者,也就是當前的對象。 95 public String desc(){ 96 if(age > 2){ 97 return "恰同學少年"; 98 }else{ 99 return "還是看動畫片的 年齡";100 }101 }102 public void setName(String n){103 name = n;104 }105 public void addAge(){106 int i = 2;107 age += i;108 }109 public void info(){110 //可以在方法內調用本類的其他方法,但是不可以在方法內在定義新德爾方法111 eat();112 sleep();113 // public void breathJ(){114 // System.out.println("呼吸");115 // }116 }117 //System.out.println("Hello!");118 }
5、物件導向編程思想的落地法則一:
1、設計並建立類以及類的成分;
2、執行個體化類的對象;
3、通過“對象.屬性”或“對象.方法”的形式完成某項功能
6、類的初始化記憶體解析:
6.1、記憶體劃分的結構:
棧(stack):局部變數、對象的引用名、數組的引用名
堆(heap):new出來的“東西”(比如:對象的實體,數組的實體),含成員變數
方法區:含字串常量
靜態域:聲明為static的變數
6.2、理解的基礎上,要學會基本的建立的類的對象在記憶體中的運行。
7、方法的重載(overload):
要求:1、同一個類中;
* 2、方法名必須相同;
* 3、方法的參數列表不同;1、參數的個數不同;
* 2、參數類型不同;
* 4、方法的重載與方法的傳回值類型沒有關係;
1 /* 2 * 方法的重載(overload) 3 * 要求:1、同一個類中; 4 * 2、方法名必須相同; 5 * 3、方法的參數列表不同;1、參數的個數不同; 6 * 2、參數類型不同; 7 * 4、方法的重載與方法的傳回值類型沒有關係; 8 */ 9 public class TestOverLoad {10 11 }12 class OverLoad{13 //定義兩個int型變數的和14 public int getSum(int i, int j){15 return i + j;16 }17 //定義三個int型變數的和18 public int getSum(int i, int j, int k){19 return i + j + k;20 }21 //不能與其他幾個方法構成重載22 // public int getSum1(int i, int j, int k){23 // return i + j + k;24 // }25 // public void getSum(int i, int j, int k){26 // System.out.println(i + j + k);27 // }28 //定義兩個double型的資料的和29 public double getSum(double d1, double d2){30 return d1 + d2;31 }32 //定義三個double型資料的和33 public void getSum(double d1,double d2,double d3){34 System.out.println(d1 + d2 + d3);35 }36 //以下兩個方法也構成重載37 public void method1(int i, String str){38 39 }40 public void method1(String str1, int j){41 42 }43 }