php免費(fèi)網(wǎng)站系統(tǒng)電商seo是什么意思
【day08】面向?qū)ο蟆庋b重點(diǎn):1.封裝:a.將細(xì)節(jié)隱藏起來(lái),不讓外界直接調(diào)用,再提供公共接口,供外界通過公共接口間接使用隱藏起來(lái)的細(xì)節(jié)b.代表性的:將一段代碼放到一個(gè)方法中(隱藏細(xì)節(jié)),通過方法名(提供的公共接口)去調(diào)用private關(guān)鍵字 -> 私有的,被private修飾之后別的類不能直接調(diào)用,只能在當(dāng)前類中使用c.get/set方法set方法:為屬性賦值get方法:獲取屬性值d.this關(guān)鍵字:代表當(dāng)前對(duì)象,哪個(gè)對(duì)象調(diào)用this所在的方法this就代表哪個(gè)對(duì)象區(qū)分重名的成員變量和局部變量2.構(gòu)造:a.無(wú)參構(gòu)造:new對(duì)象特點(diǎn):jvm會(huì)自動(dòng)為每個(gè)類提供一個(gè)無(wú)參構(gòu)造b.有參構(gòu)造:new對(duì)象 為屬性賦值特點(diǎn):如果手寫了有參構(gòu)造,jvm將不再提供無(wú)參構(gòu)造,所以建議都寫上3.標(biāo)準(zhǔn)javabean:a.類必須是公共的,具體的b.必須有私有屬性c.必須有構(gòu)造方法(無(wú)參,有參)d.必須有g(shù)et/set方法快捷鍵:alt+insert模塊九重點(diǎn):1.會(huì)定義靜態(tài)成員以及會(huì)調(diào)用靜態(tài)成員2.會(huì)使用可變參數(shù)(會(huì)給可變參數(shù)傳參)3.會(huì)二分查找(手撕)4.會(huì)冒泡排序(手撕)5.會(huì)debug的使用
第一章.static關(guān)鍵字
1.static的介紹以及基本使用
1.概述:static是一個(gè)靜態(tài)關(guān)鍵字
2.使用:a.修飾一個(gè)成員變量:static 數(shù)據(jù)類型 變量名b.修飾一個(gè)方法:修飾符 static 返回值類型 方法名(形參){方法體return 結(jié)果}3.調(diào)用靜態(tài)成員:類名直接調(diào)用(不用new對(duì)象)4.靜態(tài)成員特點(diǎn):a.靜態(tài)成員屬于類成員,不屬于對(duì)象成員(非靜態(tài)的成員屬于對(duì)象成員)b.靜態(tài)成員會(huì)隨著類的加載而加載c.靜態(tài)成員優(yōu)先于非靜態(tài)成員存在在內(nèi)存中d.凡是根據(jù)靜態(tài)成員所在的類創(chuàng)建出來(lái)的對(duì)象,都可以共享這個(gè)靜態(tài)成員
public class Student {String name;int age;static String classRoom;
}
public class Test01 {public static void main(String[] args) {//先給靜態(tài)成員賦個(gè)值Student.classRoom = "222";Student s1 = new Student();s1.name = "郭靖";s1.age = 28;//s1.classRoom = "111";System.out.println(s1.name+","+s1.age+","+Student.classRoom);System.out.println("==============");Student s2 = new Student();s2.name = "黃蓉";s2.age = 26;//s2.classRoom = "111";System.out.println(s2.name+","+s2.age+","+Student.classRoom);}
}
2.static修飾成員的訪問特點(diǎn)
1.在靜態(tài)方法中能直接訪問非靜態(tài)成員嘛? 不能想要調(diào)用的話:new對(duì)象調(diào)用 2.在非靜態(tài)方法中能直接訪問靜態(tài)成員嘛? 能a.同類:直接調(diào)用類名調(diào)用b.不同類:類名調(diào)用3.在靜態(tài)方法中能直接訪問靜態(tài)成員嘛?能a.同類:直接調(diào)用類名調(diào)用b.不同類:類名調(diào)用4.在非靜態(tài)方法中能直接訪問非靜態(tài)成員嘛?能a.同類:直接調(diào)用new對(duì)象調(diào)用b.不同類:new對(duì)象調(diào)用
總結(jié):
1.不管在不在同一個(gè)類中,非靜態(tài)成員都可以new對(duì)象調(diào)用
2.不管在不在同一個(gè)類中,靜態(tài)成員都可以類名調(diào)用
問題1:既然static成員那么好使(類名直接調(diào)用),那么我們?cè)趯?shí)際開發(fā)中,能不能將所有的成員都定義成靜態(tài)的呢?不能原因:由于靜態(tài)成員會(huì)隨著類的加載而加載,如果將所有的成員都變成靜態(tài)的,那么類一加載,靜態(tài)成員都會(huì)進(jìn)內(nèi)存,會(huì)大量占用內(nèi)存空間問題2:那么靜態(tài)成員都啥時(shí)候定義呢?一般情況下,我們?cè)诔槿」ぞ哳惖臅r(shí)候可以將工具類中的所有成員都定義成靜態(tài)的問題3:啥時(shí)候定義工具類?比如我們?cè)趯懘a的過程中,發(fā)現(xiàn)有的功能在反復(fù)實(shí)現(xiàn),代碼一樣,功能一樣,此時(shí)就可以抽取出來(lái),形成工具類
public class ArraysUtils {/*構(gòu)造方法用private修飾工具類中的成員都是靜態(tài)的,靜態(tài)成員都是類名調(diào)用,不需要new對(duì)象所以工具類中的構(gòu)造方法都是用private修飾如果構(gòu)造方法被private修飾,那么在別的類中,就不能利用構(gòu)造方法new對(duì)象*/private ArraysUtils(){}//定義一個(gè)方法,實(shí)現(xiàn)獲取int數(shù)組最大值public static int getMax(int[] arr){int max = arr[0];for (int i = 1; i < arr.length; i++) {if (max<arr[i]){max = arr[i];}}return max;} }
public class Test01 {public static void main(String[] args) {int[] arr = {5,3,4,6,7,54,8};int max = ArraysUtils.getMax(arr);System.out.println("max = " + max);} }
public class Test02 {public static void main(String[] args) {int[] arr = {5,4,5,7,8,9};int max = ArraysUtils.getMax(arr);System.out.println("max = " + max);} }
第二章.可變參數(shù)
1.需求:定義一個(gè)方法,實(shí)現(xiàn)n個(gè)整數(shù)相加2.分析:方法參數(shù)位置,只明確了參數(shù)的類型,但是不明確參數(shù)個(gè)數(shù),此時(shí)就可以定義成可變參數(shù)
1介紹和基本使用
1.定義格式:數(shù)據(jù)類型...變量名2.注意:a.可變參數(shù)的本質(zhì)是一個(gè)數(shù)組b.參數(shù)位置不能連續(xù)寫多個(gè)可變參數(shù),而且當(dāng)可變參數(shù)和其他普通參數(shù)一起使用時(shí),可變參數(shù)需要放到參數(shù)列表最后
public class Demo01Var {public static void main(String[] args) {sum(1,2,3,4,5);sum1(1,1,2,3,4);}public static void sum(int...arr){int sum = 0;for (int i = 0; i < arr.length; i++) {sum+=arr[i];}System.out.println(sum);}public static void sum1(int i,int...arr){}}
1.1字符串拼接
需求一:返回n個(gè)字符串拼接結(jié)果,如果沒有傳入字符串,那么返回空字符串""
public class Demo02Var {public static void main(String[] args) {String result = concat("張無(wú)忌", "張翠山", "張三豐", "張三");System.out.println("result = " + result);}public static String concat(String...s){String str = "";for (int i = 0; i < s.length; i++) {str+=s[i];}return str;}
}
需求二:n個(gè)字符串進(jìn)行拼接,每一個(gè)字符串之間使用某字符進(jìn)行分隔,如果沒有傳入字符串,那么返回空字符串""
比如:concat("-","張三豐","張翠山","張無(wú)忌") -> 返回 -> 張三豐-張翠山-張無(wú)忌
public class Demo03Var {public static void main(String[] args) {String result = concat("-", "張三豐", "張翠山", "張無(wú)忌");System.out.println("result = " + result);}public static String concat(String regex, String... s) {String str = "";for (int i = 0; i < s.length; i++) {if (i == s.length - 1) {str += s[i];} else {str += s[i] + regex;}}return str;}
}
第三章.遞歸
1.概述:方法內(nèi)部自己調(diào)用自己
2.分類:a.直接遞歸public static void method(){method()}b.間接遞歸:A(){B()}B(){C()}C(){A()}3.注意:a.遞歸必須要有出口,否則會(huì)出現(xiàn)"棧內(nèi)存溢出"b.遞歸即使有出口,遞歸次數(shù)不不要太多
public class Demo01Recursion {public static void main(String[] args) {method();}public static void method(){method();}
}
示例一:需求:利用遞歸輸出3到1
public class Demo02Recursion {public static void main(String[] args) {method(3);}public static void method(int n){if (n==1){System.out.println(n);//結(jié)束方法return;}System.out.println(n);n--;method(n);}
}
示例二:求n!(n的階乘)
1.需求:定義一個(gè)方法,完成3的階乘3*2*1
2.分析:假如定義一個(gè)方法,代表n的階乘 -> method(n) -> n接收幾,就代表幾的階乘method(1) 1method(2) 2*1 -> 2*method(1)method(3) 3*2*1 -> 3*method(2)method(n) -> n*method(n-1)
public class Demo03Recursion {public static void main(String[] args) {int method = method(3);System.out.println("method = " + method);}public static int method(int n){if (n==1){return 1;}return n*method(n-1);}
}
示例三:計(jì)算斐波那契數(shù)列(Fibonacci)的第n個(gè)值
不死神兔
故事得從西元1202年說起,話說有一位意大利青年,名叫斐波那契。
在他的一部著作中提出了一個(gè)有趣的問題:假設(shè)一對(duì)剛出生的小兔一個(gè)月后就能長(zhǎng)成大兔,再過一個(gè)月就能生下一對(duì)小兔,并且此后每個(gè)月都生一對(duì)小兔,一年內(nèi)沒有發(fā)生死亡
問:一對(duì)剛出生的兔子,一年內(nèi)繁殖成多少對(duì)兔子?
規(guī)律:一個(gè)數(shù)等于前兩個(gè)數(shù)之和,比如: 1 1 2 3 5 8 13 21 34 55…
1.假設(shè):定義一個(gè)方法,叫做method,參數(shù)傳遞month,代表月份2.分析:method(1) 1method(2) 1method(3) 2 -> method(1)+method(2)method(4) 3 -> method(2)+method(3)method(5) 5 -> method(3)+method(4) method(n) -> method(n-2)+method(n-1)
public class Demo04Recursion {public static void main(String[] args) {int method = method(12);System.out.println("method = " + method);}public static int method(int n){if (n==1 || n==2){return 1;}return method(n-1)+method(n-2);}
}
第四章.數(shù)組常見算法
1.數(shù)組翻轉(zhuǎn)
1.概述:數(shù)組對(duì)稱索引位置上的元素互換
public class Demo01Reverse {public static void main(String[] args) {int[] arr = {1,2,3,4,5,6,7};for (int min = 0,max = arr.length-1;min<max;min++,max--){int temp = arr[min];arr[min] = arr[max];arr[max] = temp;}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}}
}
2.冒泡排序
數(shù)組的排序,是將數(shù)組中的元素按照大小進(jìn)行排序,默認(rèn)都是以升序的形式進(jìn)行排序,數(shù)組排序的方法很多,我們講解的是數(shù)組的冒泡排序。排序,都要進(jìn)行數(shù)組 元素大小的比較,再進(jìn)行位置的交換。冒泡排序法是采用數(shù)組中相鄰元素進(jìn)行比較換位。arr[i](前一個(gè)元素) arr[i+1](后一個(gè)元素)
2.1 代碼實(shí)現(xiàn)
public class Demo02Bubble {public static void main(String[] args) {//定義一個(gè)數(shù)組,長(zhǎng)度為5,最大索引為4int[] arr = {5,4,3,2,1};/*第一圈越界原因:當(dāng)i變化到4的時(shí)候-> arr[4]>arr[5] -> 直接操作了5索引,所以越界了越界解決:我們可以讓arr.length-1如果arr.length-1-> 比較就是i<4 -> 此時(shí)i最大可以變化到3當(dāng)i變化到3時(shí) -> arr[3]>arr[4] -> 正好是最后兩個(gè)元素進(jìn)行比較*//*for (int i = 0; i < arr.length-1-0; i++) {if (arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr[i+1];arr[i+1] = temp;}}*///第二圈/*for (int i = 0; i < arr.length-1-1; i++) {if (arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr[i+1];arr[i+1] = temp;}}*///第三圈/*for (int i = 0; i < arr.length-1-2; i++) {if (arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr[i+1];arr[i+1] = temp;}}*///第四圈/*for (int i = 0; i < arr.length-1-3; i++) {if (arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr[i+1];arr[i+1] = temp;}}*//*外層循環(huán)代表比較了幾圈n-1圈*/for (int j = 0; j < arr.length-1; j++) {/*內(nèi)層循環(huán)代表每一圈比較的次數(shù)每圈都少比較一次*/for (int i = 0; i < arr.length-1-j; i++) {if (arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr[i+1];arr[i+1] = temp;}}}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}}
}
3.二分查找
1.前提:數(shù)組中的數(shù)據(jù)必須是有序的
2.查詢思想:a.老式查詢:遍歷數(shù)組,一個(gè)一個(gè)比較 -> 查詢效率慢b.二分查找:每次找中間索引對(duì)應(yīng)的元素進(jìn)行比較查詢(每一次查詢少一半數(shù)據(jù))
public class Demo03Binary {public static void main(String[] args) {int[] arr = {1,2,3,4,5,6,7,8,9};int index = binary(arr, 60);System.out.println(index);}public static int binary(int[] arr,int data){//定義三個(gè)變量,分別代表最大索引,最小索引,中間索引int min = 0;int max = arr.length-1;int mid = 0;//查找while(min<=max){mid = (min+max)/2;if (data>arr[mid]){min = mid+1;}else if(data<arr[mid]){max = mid-1;}else{return mid;}}return -1;}
}
第五章.對(duì)象數(shù)組
1.對(duì)象數(shù)組
1.需求:定義一個(gè)長(zhǎng)度為3的數(shù)組,存儲(chǔ)3個(gè)Person對(duì)象,遍歷數(shù)組,將三個(gè)Person對(duì)象中的屬性值獲取出來(lái)
public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
public class Demo01ObjectArray {public static void main(String[] args) {/*Person p = new Person();1.定義一個(gè)存儲(chǔ)int型數(shù)據(jù)的數(shù)組:int[]2.定義一個(gè)存儲(chǔ)double型的數(shù)組:double[]3.定義一個(gè)存儲(chǔ)String型的數(shù)組:String[]4.定義一個(gè)存儲(chǔ)Person型的數(shù)組:Person[]*///定義數(shù)組Person[] arr = new Person[3];//創(chuàng)建三個(gè)對(duì)象Person p1 = new Person("金蓮",26);Person p2 = new Person("濤哥",18);Person p3 = new Person("張三",20);//將三個(gè)對(duì)象保存到數(shù)組中arr[0] = p1;arr[1] = p2;arr[2] = p3;/*遍歷當(dāng)i = 0 arr[0] 就是 p1對(duì)象當(dāng)i = 1 arr[1] 就是 p2對(duì)象當(dāng)i = 2 arr[2] 就是 p3對(duì)象*/for (int i = 0; i < arr.length; i++) {//Person p = arr[i];System.out.println(arr[i].getName()+"..."+arr[i].getAge());}}
}
練習(xí)1
(1)定義學(xué)生類Student聲明姓名和成績(jī)成員變量(2)測(cè)試類ObjectArrayTest的main中創(chuàng)建一個(gè)可以裝3個(gè)學(xué)生對(duì)象的數(shù)組,并且按照學(xué)生成績(jī)排序,顯示學(xué)生信息
public class Student {private String name;private int score;public Student() {}public Student(String name, int score) {this.name = name;this.score = score;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}
}
public class Demo02ObjectArray {public static void main(String[] args) {Student[] students = new Student[3];students[0] = new Student("金蓮",26);students[1] = new Student("大郎",50);students[2] = new Student("濤哥",18);for (int j = 0; j < students.length-1; j++) {for (int i = 0; i < students.length-1-j; i++) {if (students[i].getScore()>students[i+1].getScore()){Student temp = students[i];students[i] = students[i+1];students[i+1] = temp;}}}for (int i = 0; i < students.length; i++) {System.out.println(students[i].getName()+"..."+students[i].getScore());}}
}
第六章.方法參數(shù)
1.基本數(shù)據(jù)類型做方法參數(shù)傳遞
基本類型做方法參數(shù)傳遞,傳遞的是值,不是變量本身
方法運(yùn)行:壓棧
方法運(yùn)行完畢:彈棧 -> 釋放棧內(nèi)存
public class Demo01Param {public static void main(String[] args) {int a = 10;int b = 20;method(a,b);System.out.println(a);//10System.out.println(b);//20}public static void method(int a,int b){a+=10;b+=20;System.out.println(a);//20System.out.println(b);//40}
}
2.引用數(shù)據(jù)類型做方法參數(shù)傳遞
引用數(shù)據(jù)類型做方法參數(shù)傳遞時(shí),傳遞的是地址值
public class Demo02Param {public static void main(String[] args) {int[] arr = {10,20};method(arr);System.out.println(arr[0]);//20System.out.println(arr[1]);//40}public static void method(int[] arr){arr[0]+=10;arr[1]+=20;System.out.println(arr[0]);//20System.out.println(arr[1]);//40}
}
第七章.命令行參數(shù)(了解)
通過命令行給main方法的形參傳遞的實(shí)參稱為命令行參數(shù)
public class TestCommandParam{//形參:String[] argspublic static void main(String[] args){for(int i=0; i<args.length; i++){System.out.println("第" + (i+1) + "個(gè)參數(shù)的值是:" + args[i]);}}
}
運(yùn)行命令:
java TestCommandParam
java TestCommandParam 1 2 3
java TestCommandParam hello atguigu
第八章.其他操作
1.快速生成方法
1.初學(xué)者要求先定義,再調(diào)用;不是初學(xué)者,就可以先調(diào)用,再定義方法a.快捷鍵:alt+回車2.快速將一段代碼抽取到一個(gè)方法中:a.選中要抽取的方法b.按ctrl+alt+m
2.debug調(diào)試
1.概述:調(diào)試代碼的一種手段2.作用:a.能清楚的看到每個(gè)變量在代碼執(zhí)行過程中的變化b.找錯(cuò)3.使用:a.在想要開始debug的那一行左邊點(diǎn)擊一下,出現(xiàn)紅色小圓點(diǎn)(斷點(diǎn))b.右鍵-> 點(diǎn)擊debug