面向對象描述
優點:耦合度低,擴展力強,更符合人類的思維方式
OOA 面向對象分析; OOD 面向對象設計 ;OOP 面向對象編程
面向對象包括三大特征
封裝 、繼承、多態
類和對象的概念
什么是類?
類實際上在現實世界當中是不存在的,是一個抽象的概念。
是一個模板。是我們人類大腦進行“思考、總結、抽象”的一個
結果。(主要是因為人類的大腦不一般才有了類的概念。)
類本質上是現實世界當中某些事物具有共同特征,將這些共同
特征提取出來形成的概念就是一個“類”,“類”就是一個模板。
明星是一個類
什么是對象?
對象是實際存在的個體。(真實存在的個體)
宋小寶就是一個對象
在java語言中,要想得到“對象”,必須先定義“類”,“對象”是通過“類”這個模板創造出來的。
類就是一個模板:類中描述的是所有對象的“共同特征信息”對象就是通過類創建出的
這幾個術語你需要自己能夠闡述出來:
類:不存在的,人類大腦思考總結一個模板(這個模板當中描述了共同特征。)
對象:實際存在的個體。
實例:對象還有另一個名字叫做實例。
實例化:通過類這個模板創建對象的過程,叫做:實例化。
抽象:多個對象具有共同特征,進行思考總結抽取共同特征的過程。
類 --【實例化】--> 對象(實例)
對象 --【抽象】--> 類
類是一個模板,是描述共同特征的一個模板,那么共同特征包括什么呢?
類 = 屬性 + 方法
屬性來源於:狀態
方法來源於:動作
類的定義
1、怎么定義一個類,語法格式是什么?
[修飾符列表] class 類名 {
//類體 = 屬性 + 方法
// 屬性在代碼上以“變量”的形式存在(描述狀態)
// 方法描述動作/行為
}
2、為什么屬性是“以”變量的形式存在的?
是因為屬性對應的是“數據”,數據在程序中只能放到變量中。
對象和引用
畫內存圖

1 public class User{ 2 // 用戶id 3 // 訪問id不能這樣:User.id (這是錯誤的,實例變量不能用類名訪問。) 4 // id的訪問必須先造對象,然后對象有了,才能訪問對象的id 5 int id; //成員變量,實例變量(對象變量,一個對象一份。) 6 // 用戶名 7 String username; // 成員變量可以不手動賦值,系統賦默認值。 8 // 密碼 9 String password; 10 } 11 12 // 第一步:類加載 13 // 第二步:調用UserTest類的main方法(方法調用要壓棧。) 14 public class UserTest{ 15 16 // 方法體外聲明的變量叫做成員變量。 17 //User u1; //成員變量。(實例變量) 18 19 public static void main(String[] args){ 20 //int i = 100; 21 22 // 方法體當中聲明的變量叫做局部變量 23 User u1 = new User(); 24 // 實例變量怎么訪問(屬性怎么訪問)? 25 // 語法是:“引用.屬性名” 26 System.out.println(u1.id); //0 27 System.out.println(u1.username); //null 28 System.out.println(u1.password); //null 29 30 u1.id = 11111; 31 u1.username = "zhangsan"; 32 u1.password = "123"; 33 34 System.out.println(u1.id); 35 System.out.println(u1.username); 36 System.out.println(u1.password); 37 38 User u2 = new User(); 39 u2.id = 22222; 40 u2.username = "lisi"; 41 u2.password = "456"; 42 43 System.out.println(u2.id); 44 System.out.println(u2.username); 45 System.out.println(u2.password); 46 } 47 }
第二個

1 // 住址類 2 public class Address{ 3 4 // 一個家庭住址有3個屬性。 5 6 // 城市 7 String city; // 實例變量 8 9 // 街道 10 String street; 11 12 // 郵編 13 String zipcode; 14 } 15 16 public class User{ 17 18 // 類=屬性+方法 19 // 以下3個都是屬性,都是實例變量。(對象變量。) 20 21 // 用戶id 22 // int是一種基本數據類型 23 int id; // 實例變量 24 25 // 用戶名 26 // String是一種引用數據類型 27 String username; // 實例變量 28 29 // 家庭住址 30 // Address是一種引用數據類型 31 // addr是成員變量並且還是一個實例變量 32 // addr是否是一個引用呢?是。addr是一個引用。 33 Address addr; 34 } 35 36 /* 37 到目前為止,如果什么也沒聽懂,怎么寫代碼? 38 記住一個知識點就行,可以后期慢慢學習畫圖。 39 記住一句話:里面有什么就能“點”什么。 40 41 所有的實例變量(屬性)都是通過“引用.”來訪問的。 42 43 引用和對象怎么區分? 44 “引用”是啥?是存儲對象內存地址的一個變量。 45 “對象”是啥?堆里new出來的。 46 47 通俗一點: 48 只要這個變量中保存的是一個對象的內存地址,那么這個變量就叫做“引用”。 49 50 思考: 51 引用一定是局部變量嗎? 52 不一定。 53 */ 54 public class Test{ 55 public static void main(String[] args){ 56 57 //報錯了。id是實例變量,必須先創建對象,通過“引用.”的方式訪問。 58 /* 59 User u = new User(); 60 u是引用。 61 */ 62 //System.out.println(User.id); 63 64 65 66 /* 67 int i = 100; 68 int j = i; // 原理:會將i中保存的100復制一份,傳給j變量。 69 */ 70 71 // 家庭住址對象 72 Address a = new Address(); 73 a.city = "北京"; 74 a.street = "大興區"; 75 a.zipcode = "121221"; 76 77 // 用戶對象 78 User u = new User(); 79 System.out.println(u.id); // 0 80 System.out.println(u.username); // null 81 System.out.println(u.addr); // null 82 83 u.id = 11111; 84 u.username = "zhangsan"; 85 u.addr = a; 86 87 // 思考一個問題: 88 // 我想直到zhangsan他是哪個城市的,代碼應該怎么寫? 89 System.out.println(u.username + "是"+u.addr.city+"城市的!"); 90 91 // u.addr.city 這行代碼可否拆分呢?u.addr.city 節省變量。 92 // 拆分成以下代碼和以上效果完全相同,原理完全相同,不同的是以下代碼多了兩個變量。 93 Address ad = u.addr; 94 String zhuZhi = ad.city; 95 96 System.out.println(zhuZhi); 97 98 //-----------------------是否理解以下代碼--------------------------- 99 int x = 100; 100 // = 代表賦值運算,“賦值”中有一個“值” 101 // x變量中的值是100. 將100復制一份給y 102 // 表示:將x變量中保存的值100復制一份給y 103 int y = x; 104 105 //-----------------------是否理解以下代碼--------------------------- 106 Address k = new Address(); // Address k = 0x1111; 107 Address m = k; // 這里表示將k變量中保存的0x1111復制了一份傳給了m變量。 108 109 } 110 }
需要注意:
// int x = 100 ; -- 在棧里直接保存 100
// = 代表賦值運算,“賦值” 中有個值;
// X 變量中的值是100,將100 復制一份到 y
// int y= x;
//-----------------------
Address k = new Address(); // Address k = 0x1111; -- 這個是 堆中的對象的地址
Address m = k; // 這里表示將k變量中保存的0x1111復制了一份傳給了m變量。
空指針異常(NullPointerException)
1 /* 2 空指針異常。(NullPointerException) 3 4 關於垃圾回收器:GC 5 在java語言中,垃圾回收器主要針對的是堆內存。 6 當一個java對象沒有任何引用指向該對象的時候, 7 GC會考慮將該垃圾數據釋放回收掉。 8 9 出現空指針異常的前提條件是? 10 "空引用"訪問實例【對象相關】相關的數據時,都會出現空指針異常。 11 */ 12 public class NullPointerTest{ 13 public static void main(String[] args){ 14 // 創建客戶對象 15 Customer c = new Customer(); 16 // 訪問這個客戶的id 17 System.out.println(c.id); // 0 18 19 // 重新給id賦值 20 c.id = 9521; // 終身代號 21 System.out.println("客戶的id是=" + c.id); 22 23 c = null; 24 // NullPointerException 25 // 編譯器沒問題,因為編譯器只檢查語法,編譯器發現c是Customer類型, 26 // Customer類型中有id屬性,所以可以:c.id。語法過了。 27 // 但是運行的時候需要對象的存在,但是對象沒了,尷尬了,就只能出現一個異常。 28 System.out.println(c.id); 29 } 30 } 31 32 class Customer{ 33 // 客戶id 34 int id; // 成員變量中的實例變量,應該先創建對象,然后通過“引用.”的方式訪問。 35 }
方法調用參數傳遞
java中規定:參數傳遞的時候,和類型無關,不管是基本數據類型還是引用數據類型
統一都是將盒子中保存的那個“值”復制一份,傳遞下去。
java中只有一個規定:參數傳遞的時候,一定是將“盒子”中的東西復制一份傳遞過去。
內存地址也是值,也是盒子中保存的一個東西。


ps Java中沒有指針,通過引用訪問堆內存的數據