?
面向對象編程 |
筆記Notes
? |
1.創建一個類,并在類中提供必要的屬性和方法 2.由類派生出對象。(創建對象) 3.調用對象中的屬性和方法。(對象名.屬性名/方法名) ? ? ? ? ? ? ?//創建一個類 class?Person{ ??????????//屬性 ??????????String?name; ??????????int?age; ??????????char?sex; ?????????? ??????????//方法 ??????????public?void?run(){ ???????????????????System.out.println(name?+?"跑起來"); ??????????} ?????????? ??????????public?void?say(){ ???????????????????System.out.println(name?+?"今年"?+?age); ??????????} } ? ? // main 方法中 ???????????????????Person?person?=?new?Person(); ???????????????????//調用屬性 :對象名.屬性名 ???????????????????person.name?=?"王慶港";?//給屬性賦值 ???????????????????person.age?= 23; ???????????????????//獲取屬性的值 ???????????????????String?name?=?person.name; ???????????????????System.out.println("name="?+?name); ???????????????????//調用方法 :對象名.方法名 ???????????????????person.run(); ???????????????????person.say();
①按照數據類型分 :基本數據類型?vs?引用數據類型 ②按照位置分 :成員變量??vs?局部變量
①變量的聲明的格式都是一樣的。 ②變量都有作用域 ③變量都是先聲明后使用
①局部變量:在方法里,方法的形參,構造器中,構造器的形參,代碼塊 ②成員變量:?在類中方法等結構外
①局部變量:不能使用權限修飾符修飾 ②成員變量:可以使用四種權限修飾符(public protected 缺省的(default) private)
①局部變量:在內存的棧中 ②成員變量:在內存的堆(對象)中
①局部變量 :沒有默認值 ②成員變量 :有默認值(和數組元素的默認值是一樣的) ?byte,short,int,long -> 0 ?float,double -> 0.0 ?boolean -> false ?char -> \u0000 引用數據類型 -> null ? ? class?Animal{ ??????????//屬性(成員變量) ??????????public?String?name?=?"動物"; ??????????int?legs; ??????????protected?boolean?isLive?=?true; ??????????{//代碼塊 ???????????????????String?address?=?"";//局部變量 ??????????} ??????????public?Animal(){}? ??????????//構造器 ??????????public?Animal(int?sex){//構造器的形參 ???????????????????int?a?= 10;//局部變量 ??????????} ??????????//方法 ??????????public?void?say(int?sex){//方法的形參 ???????????????????//局部變量 ???????????????????int?age?= 10; ???????????????????age?= 20; ???????????????????name?=?"大錘"; ??????????} } ?
修飾符?返回值類型?方法名(參數類型?形參1,?參數類型?形參2,?….){ 方法體程序代碼 return?返回值; } ? ?
①void/具體的類型(基本數據類型、引用數據類型): ②void : 表示該方法沒有返回值 具體的類型 :調用該方法會有返回值。 注意:返回數據需要使用return關鍵字。return 后面跟需要返回的數據。
(形參相同的情況下,同一個類中的方法名不能相同)。
①作用 :用來通知方法的調用者調用此方法時需要傳遞數據。 ②注意:實參的類型必須和形參的類型保持一致
注意 :只有調用方法時方法體才會執行。 ? 對象數組題目: 定義類Student,包含三個屬性:學號number(int),年級state(int),成績score(int)。創建20個學生對象,學號為1到20,年級和成績都由隨機數確定。 問題一:打印出3年級(state值為3)的學生信息。 問題二:使用冒泡排序按學生成績排序,并遍歷所有學生信息 提示: 1)?生成隨機數:Math.random(),返回值類型double;? 2)?四舍五入取整:Math.round(double d),返回值類型long。 ? class?Student1{ ??????????int??number; ??????????int?state; ??????????int?score; ?????????? ??????????@Override ??????????public?String toString() { ???????????????????return?"Student1 [number="?+?number?+?", state="?+?state?+?", score="?+?score?+?"]"; ??????????} ?????????? } public?class?StuInfo { ??????????public?static?void?main(String[]?args) { ???????????????????// 創建對象數組 ???????????????????Student1[]?studentArr?=?new?Student1[20]; ???????????????????// 循環創建對象并賦值,傳給對象 ??????????????????? ???????????????????for?(int?i?= 0;?i?< 20;?i++) { ?????????????????????????????Student1?student1?=?new?Student1(); ?????????????????????????????student1.number?=?i; ?????????????????????????????student1.state?= (int)Math.round( (Math.random()*7)); ?????????????????????????????student1.score?= (int) (Math.random()*100);??? ?????????????????????????????studentArr[i] =?student1; ???????????????????} ???????????????????System.out.println("---------打印排序前的學生信息-------------"); ???????????????????for?(int?i?= 0;?i?<?studentArr.length;?i++) { ?????????????????????????????System.out.println(studentArr[i]); ???????????????????} ??????????????????? ???????????????????System.out.println("----------打印state為3的學生信息---------"); ???????????????????// 循環查找對象數組中state值為3的對象,打印輸出對象信息 ???????????????????for?(int?i?= 0;?i?<?studentArr.length;?i++) { ?????????????????????????????if?(studentArr[i].state?== 3) { ??????????????????????????????????????System.out.println(studentArr[i]); ?????????????????????????????} ???????????????????} ???????????????????System.out.println("----------------------------------------"); ???????????????????// 使用冒泡排序按學生成績排序,并遍歷所有學生信息 ???????????????????// 思路:兩個循環遍歷數組中的對象的成績,若對象的成績小于后一個,則交換對象的位置 ???????????????????for?(int?i?= 0;?i?<?studentArr.length?-1;?i++) {?// 外層循環決定冒泡排序的次數,為數組長度-1 ?????????????????????????????for?(int?j?= 0;?j?<?studentArr.length?-?i?-1;?j++) {?// 內層循環決定每次多少次冒泡,為 ??????????????????????????????????????if?(studentArr[j].score?>?studentArr[j+1].score) {?// 如果前面的對象小于大于后面的,就叫交換類數組地址 ????????????????????????????????????????????????Student1?temp?=?studentArr[j]; ????????????????????????????????????????????????studentArr[j] =?studentArr[j+1]; ????????????????????????????????????????????????studentArr[j+1] =?temp; ??????????????????????????????????????} ?????????????????????????????} ???????????????????} ???????????????????// 注意!!!!!!!!!! ???????????????????// 冒泡排序交換的值的數組的下標為內循環的循環變量 ???????????????????System.out.println("------打印排序后的信息-------"); ???????????????????// 打印排序后的信息 ???????????????????for?(int?i?= 0;?i?<?studentArr.length;?i++) { ?????????????????????????????System.out.println(studentArr[i]); ?????????????????????????????????????? ???????????????????} ??????????????????? ??????????} } ?
①在同一個類中,允許存在一個以上的同名方法,只要它們的參數個數或者參數類型不同即可。 ②與返回值類型無關,只看參數列表,且參數列表必須不同。 (參數個數或參數類型)。調用時,根據方法參數列表的不同來區別。 ③示例: //返回兩個整數的和 ??int?add(int?x,int?y){return?x+y;} //返回三個整數的和 ??int?add(int?x,int?y,int?z){return?x+y+z;} //返回兩個小數的和 double add(double?x,double?y){return?x+y;} 注意!!: ①不同的形參列表 :形參的個數,順序,類型不同 ②方法的重載和權限修飾符,返回值類型,形參的名字無關。 ③判斷方法:只看 方法名 + 形參列表(看形參和實參的類型) ?
? ? ? ? ? ? ? ? ?①可變形參的底層就是一個數組 ? ? ? ? ? ? ? ? ?②在可變形參的方法中,和可變形參相同類型的數組的方法不構成重載。 ? ? ? ? ? ? ? ? ?③在形參列表中可變形參只能放在最后 ? ? ? ? ? ? ? ? ?④在同一個方法的形參列表中只能有一個可變形參。 ? ? ? ? ? ? ? ? ?⑤ 可變形參的個數可以是0個1個或多個
在創建對象以后,就可以通過對象名.屬性名這種方式對屬性直接進行操作。這種操作對于屬性只有類型和范圍的限制。但是在實際開發中我們會有更多的其它的限制條件。而這些限制條件又不能在屬性的聲明處加以限制。我們采取取如下方式 ①使用權限修飾符對屬性進行權限的限制,那么在類的外部就不能隨意的再調用類中的屬性 ②提供公共的方法,在方法中可以加以限制其它的條件。然后可以通過該方法給屬性賦值和獲取屬性的值。 ? ? ? ? ? ? ? ? ?
①將屬性私有化。(private修飾屬性) ②提供公共的set/get方法。(set方法用來給屬性賦值,get方法用來獲取屬性的值) ? ? ? ? ? ? ? ? ?
①可以使用四種權限修飾符:private,缺省的,protected,public ②四種權限修飾符可以修飾 :屬性,方法,構造器,內部類 ③類只能被public和缺省的修飾。 ?
?
? ?
① 默認初始化:int a; ② 顯式初始化:int a = 0; ③ 構造器中初始化 ④ 通過“對象.屬性“或“對象.方法”的方式賦值
? ① - ② - ③ - ④ ? ?
?
①它在方法內部使用,即這個方法所屬對象的引用; ②它在構造器內部使用,表示該構造器正在初始化的對象。
具體的:我們可以用this來區分屬性和局部變量。 public?void?setAge(int?age){ ???????????age?=?age;//局部變量 :就近原則(屬性名和局部變量名相同時默認調用的是局部變量) ? ? ? ? ? ?System.out.println("==========="?+?age); }
|
總結Summary |
|
?