有哪些網(wǎng)站開發(fā)框架網(wǎng)上國網(wǎng)推廣
文章目錄
- 第08章_面向?qū)ο缶幊?#xff08;高級)拓展練習(xí)
- 01-關(guān)鍵字:static
- 1、銀行賬戶類
- 2、圖形類
- 3、數(shù)組工具類
- 4、二分查找
- 5、二分查找
- 6、素數(shù)
- 7、閱讀代碼,分析運行結(jié)果
- 8、閱讀代碼,分析運行結(jié)果
- 02-代碼塊
- 9、閱讀代碼,分析運行結(jié)果
- 10、閱讀代碼,分析運行結(jié)果
- 11、閱讀代碼,分析運行結(jié)果
- 12、閱讀代碼,分析運行結(jié)果
- 13、閱讀代碼,分析運行結(jié)果
- 14、閱讀代碼,分析運行結(jié)果
- 15、閱讀代碼,分析運行結(jié)果
- 16、閱讀代碼,分析運行結(jié)果
- 17、閱讀代碼,分析運行結(jié)果
- 03-關(guān)鍵字:final
- 18.代碼閱讀題
- 04-抽象類和抽象方法
- 19、numa、numb、numc輸出
- 20、Woman類、Man類等
- 21、Chinese、American等
- 22、幾何圖形類
- 23、交通工具
- 05-接口
- 24、代碼閱讀題
- 25、代碼閱讀題
- 26、代碼閱讀題
- 27、FightAble接口
- 28、CompareAble接口
- 29、Filter接口
- 30、LiveAble接口
- 31、Runner、Swimming接口
- 32、A、B接口
- 33、Universe接口
- 34、Flyable、Swimming接口
- 35、Predicate接口
- 06-內(nèi)部類
- 36、代碼閱讀題
- 37、代碼閱讀題
- 38、代碼閱讀題
- 39、繼承Object匿名內(nèi)部類
- 40、CompareAble接口匿名實現(xiàn)類
- 41、Filter接口匿名實現(xiàn)類
- 42、Thread、Runnable的匿名實現(xiàn)類
- 43、Selector、Touchable接口
- 44、Iterable接口實現(xiàn)類
- 07-枚舉類
- 45、月份枚舉類
- 46、顏色枚舉類
- 47、拓展:顏色枚舉類
- 48、月份枚舉類
- 49、支付枚舉類-1
- 50、支付枚舉類-2
- 51、設(shè)備狀態(tài)枚舉類
- 08-注解
- 52、圖形工具類
- 09-包裝類
- 53、代碼閱讀題
- 54、代碼閱讀題
- 55、Employee、Programmer、Designer、Architect等類
第08章_面向?qū)ο缶幊?#xff08;高級)拓展練習(xí)
01-關(guān)鍵字:static
1、銀行賬戶類
(1)聲明一個銀行賬戶類Account
- 成員變量:利率、賬號、余額,其中所有賬戶的利率是相同的,所有成員變量都私有化。
- 提供get/set
- 提供有參構(gòu)造public Account(String id ,double balance)
- 提供計算年利息方法public double annualInterest(),余額*利率
- 重寫toString方法,返回賬號和余額、年利息
(2)在測試類的main中,創(chuàng)建賬戶類的兩個對象,賬號分別為“11111”和“22222”,余額分別為“1000和2000”元,利率初始值是0.035,調(diào)用方法測試。
public class Account {private static double rate;private String id;private double balance;public Account(String id, double balance) {this.id = id;this.balance = balance;}public static double getRate() {return rate;}public static void setRate(double rate) {Account.rate = rate;}public String getId() {return id;}public void setId(String id) {this.id = id;}public double getBalance() {return balance;}public void setBalance(double balance) {this.balance = balance;}public double annualInterest(){return balance * rate;}@Overridepublic String toString() {return "Account{" +"id='" + id + '\'' +", balance=" + balance +", 年利息 =" + annualInterest() +'}';}
}
public class Exercise1 {public static void main(String[] args) {Account a1 = new Account("11111",1000);Account a2 = new Account("22222",2000);Account.setRate(0.035);System.out.println(a1);System.out.println(a2);}
}
2、圖形類
(1)聲明一個圖形父類Shape,包含
- public double area():返回0.0
- public double perimeter():返回0.0
- public String toString():返回“面積:xxx,周長:xxx”
(2)聲明一個矩形Rectangle,繼承Shape父類
- 屬性:長和寬,私有化
- 提供get/set
- 提供無參構(gòu)造和有參構(gòu)造
- 重寫area()和perimeter方法,
- 重寫toString方法,返回“長:xx,寬:xx,面積:xxx,周長:xxx”
(3)聲明一個三角形Triangle,繼承Shape父類
- 屬性:a,b,c分別代表三角形的三邊,私有化
- 提供get/set
- 提供有參構(gòu)造,public Triangle(double a, double b, double c),并驗證a,b,c的值是否可以構(gòu)成三角形,如果可以構(gòu)成三角形再為a,b,c的屬性賦值
- 重寫area()和perimeter方法,
- 重寫toString方法,返回“邊長:xx,xx,xx,面積:xxx,周長:xxx”
(4)聲明圖形工具類ShapeTools
- 提供靜態(tài)方法public static int compare(Shape s1, Shape s2)如果s1的面積大于、小于、等于s2的面積,分別返回正整數(shù)、符整數(shù)和0。
- 提供靜態(tài)方法public static boolean equals(Shape s1, Shape s2)比較兩個圖形的面積和周長是否都相等
- 提供靜態(tài)方法public static void sort(Shape[] arr)可以給所有圖形按照面積從小到大排序,如果面積相同的按照周長從小到大排序
- 提供靜態(tài)方法public static void print(Shape[] arr)可以遍歷輸出所有圖形信息
(5)在測試類中:
- 創(chuàng)建兩個矩形r1(2,3),r2(3,6),創(chuàng)建2個三角形t1(3,4,5),t2(6,6,6),
- 調(diào)用compare方法比較r1和t1,
- 調(diào)用equals方法比較r2和t2,
- 創(chuàng)建Shape數(shù)組中,把上面4個對象放到數(shù)組中,調(diào)用就sort方法排序,在排序前后調(diào)用print方法遍歷顯示信息
public class Shape {public double area(){return 0.0;}public double perimeter(){return 0.0;}public String toString(){return "面積:" + area() +",周長:" + perimeter();}
}
public class Rectangle extends Shape {private double length;private double width;public Rectangle() {}public Rectangle(double length, double width) {this.length = length;this.width = width;}public double getLength() {return length;}public void setLength(double length) {this.length = length;}public double getWidth() {return width;}public void setWidth(double width) {this.width = width;}@Overridepublic double area() {return length * width;}@Overridepublic double perimeter() {return 2 * (length + width);}@Overridepublic String toString() {return "長:" + length +", 寬" + width +"," + super.toString();}
}
public class Triangle extends Shape {private double a;private double b;private double c;public Triangle() {}public Triangle(double a, double b, double c) {if(a>0 && b> 0 && c>0 && a+b>c && b+c>a && a+c>b) {this.a = a;this.b = b;this.c = c;}}public double getA() {return a;}public void setA(double a) {this.a = a;}public double getB() {return b;}public void setB(double b) {this.b = b;}public double getC() {return c;}public void setC(double c) {this.c = c;}@Overridepublic double area() {double p = (a+b+c)/2;return Math.sqrt(p * (p-a) * (p-b) *(p-c));}@Overridepublic double perimeter() {return a+b+c;}@Overridepublic String toString() {return "邊長:" + a +"," + b +"," + c +"," + super.toString();}
}
public class ShapeTools {public static int compare(Shape s1, Shape s2){if(s1.area() > s2.area()){return 1;}else if(s1.area() < s2.area()){return -1;}return 0;}public static boolean equals(Shape s1, Shape s2){return s1.area() == s2.area() && s1.perimeter() == s2.perimeter();}public static void sort(Shape[] arr){for (int i = 1; i < arr.length; i++) {for (int j = 0; j < arr.length-i; j++) {boolean flag = false;if(arr[j].area()>arr[j+1].area()){flag = true;}else if(arr[j].area() == arr[j+1].area()){if(arr[j].perimeter() > arr[j+1].perimeter()) {flag = true;}}if(flag){Shape temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}}public static void print(Shape[] arr){for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}
}
public class Exercise2 {public static void main(String[] args) {Rectangle r1 = new Rectangle(2,3);Rectangle r2 = new Rectangle(3,6);Triangle t1 = new Triangle(3,4,5);Triangle t2 = new Triangle(6,6,6);int result = ShapeTools.compare(r1,t1);if(result == 0){System.out.println("r1和t1的面積相等");}else if(result>0){System.out.println("r1的面積大于t1的面積");}else{System.out.println("r1的面積小于t1的面積");}System.out.println("r2和t2的面積和周長是否都相等?" + ShapeTools.equals(r2,t2));Shape[] arr = new Shape[4];arr[0] = r1;arr[1] = r2;arr[2] = t1;arr[3] = t2;System.out.println("排序前:");ShapeTools.print(arr);ShapeTools.sort(arr);System.out.println("排序后:");ShapeTools.print(arr);}
}
3、數(shù)組工具類
聲明一個數(shù)組工具類ArrayTools,包含如下方法:
- public static int binarySearch(int[] arr, int value):使用二分查找法在arr數(shù)組中查找value的下標(biāo),如果value不存在,就返回-1,如果數(shù)組arr不是有序的,結(jié)果將不一定正確。
- public static int[] copyOf(int[] arr,int newLength):實現(xiàn)復(fù)制一個newLength長的數(shù)組,如果newLength<=arr.length,則新數(shù)組復(fù)制arr數(shù)組的[0, newLength-1]的元素,如果newLength>arr.length,則新數(shù)組前面[0, arr.length-1]的元素從arr數(shù)組復(fù)制,后面的元素保持默認(rèn)值。
- public static void sort(int[] arr):可以給arr數(shù)組從小到大排序,用冒泡排序?qū)崿F(xiàn)。
- public static String toString(int[] arr):將元素拼接為"{元素1,元素2,…}"的字符串返回。
在測試類的main方法中
- 隨機產(chǎn)生10個[0,100)的元素然后遍歷顯示
- 從小到大排序后顯示
- 從鍵盤輸入一個整數(shù),查找它是否在排序后的數(shù)組中,如果存在就顯示下標(biāo),如果不存在就提示不存在
- 復(fù)制3個數(shù)組,新數(shù)組的長度分別為5,10,15,并遍歷顯示新數(shù)組
public class ArrayTools {public static int binarySearch(int[] arr, int value){for(int left=0,right=arr.length-1; left<=right;){int mid = left + (right-left)/2;if(value == arr[mid]){return mid;}else if(value < arr[mid]){right = mid -1;}else{left = mid + 1;}}return -1;}public static int[] copyOf(int[] arr, int newLength){int[] newArr = new int[newLength];for (int i = 0; i < newArr.length && i < arr.length; i++) {newArr[i] = arr[i];}return newArr;}public static void sort(int[] arr){for (int i = 1; i < arr.length; i++) {for (int j = 0; j < arr.length-i; j++) {if(arr[j] > arr[j+1]){int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}}public static String toString(int[] arr){String result = "[";for (int i = 0; i < arr.length; i++) {if(i==0){result += arr[i];}else{result += "," + arr[i];}}result +="]";return result;}}
public class Exercise3 {public static void main(String[] args) {int[] arr = new int[10];for (int i = 0; i < arr.length; i++) {arr[i] = (int)(Math.random()*100);}System.out.println(ArrayTools.toString(arr));ArrayTools.sort(arr);System.out.println(ArrayTools.toString(arr));Scanner input = new Scanner(System.in);System.out.print("請輸入一個[0,100)范圍的整數(shù):");int num = input.nextInt();input.close();int index = ArrayTools.binarySearch(arr, num);if(index==-1){System.out.println(num +"在arr中不存在");}else{System.out.println(num +"在arr的下標(biāo)是:" + index);}int[] fiveElements = ArrayTools.copyOf(arr, 5);System.out.println(ArrayTools.toString(fiveElements));int[] tenElements = ArrayTools.copyOf(arr, 10);System.out.println(ArrayTools.toString(tenElements));int[] fifteenElements = ArrayTools.copyOf(arr, 15);System.out.println(ArrayTools.toString(fifteenElements));}
}
4、二分查找
public class Exercise4 {public static int binarySearch(int[] intsArray, int des) {int left = 0;int right = intsArray.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (intsArray[mid] == des) {return mid;} else if (des > intsArray[mid]) {left = mid + 1;} else {right = mid - 1;}}return -1;}
}
5、二分查找
public class Exercise5 {public static int binarySearch(String[] intsArray, String des) {int left = 0;int right = intsArray.length-1;while(left<=right) {int mid = left + (right - left)/2;if(intsArray[mid].equals(des)) {return mid;}else if(des.compareTo(intsArray[mid])>0){//字符串比較大小的方法left = mid+1;}else {right=mid-1;}}return -1;}
}
6、素數(shù)
public class Exercise6 {public static void main(String[] args) throws InterruptedException {System.out.println(Arrays.toString(suShu(10)));}public static int[] suShu(int n){int[] arr = new int[n];int index=0;for (int i = 2; i < n; i++) {boolean flag = true;for (int j = 2; j < i; j++) {if(i%j==0) {flag=false;break;}}if(flag) {arr[index++] = i;}}return Arrays.copyOf(arr, index);}
}
7、閱讀代碼,分析運行結(jié)果
public class Exercise7 {static int x, y, z;static {int x = 5;x--;}static {x--;}public static void main(String[] args) {System.out.println("x=" + x);z--;method();System.out.println("result:" + (z + y + ++z));}public static void method() {y = z++ + ++z;}
}
8、閱讀代碼,分析運行結(jié)果
public class Exercise8 {public static void main(String[] args) {System.out.println(new SDText().x+","+new SDText().y+","+new SDText().x);}
}
class SDText{static SDText sd=new SDText();static int x=3;static int y;public SDText(){x++;y++;}
}
02-代碼塊
9、閱讀代碼,分析運行結(jié)果
public class T {public static int k = 0;public static T t1 = new T("t1");public static T t2 = new T("t2");public static int i = print("i");public static int n = 99;public int j = print("j");{print("構(gòu)造塊");}static{print("靜態(tài)塊");}public T(String str){System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);++n;++i;}public static int print(String str){System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);++n;return ++i;}public static void main(String[] args) {}
}
/** 對于T來說,就完成類初始化* * 創(chuàng)建對象,調(diào)用類的實例初始化<init>()或<init>(String str)* * (1)靜態(tài)變量的顯式賦值* k = 0;t1 = new T("t1");<init>(String str)①j = print("j");print方法代碼如下:public static int print(String str){System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); 1:j i=0 n=0++n; n=1 k=1return ++i; i=1}② {print("構(gòu)造塊");print方法代碼如下:public static int print(String str){System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); 2:構(gòu)造塊 i=1 n=1++n; n=2 k=2return ++i; i=2}}③public T(String str){System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); 3:t1 i=2 n=2 ++n; n=3 k=3++i; i=3}* t2 = new T("t2");<init>(String str)①j = print("j");print方法代碼如下:public static int print(String str){System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); 4:j i=3 n=3++n; n=4 k=4return ++i; i=4}② {print("構(gòu)造塊");print方法代碼如下:public static int print(String str){System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); 5:構(gòu)造塊 i=4 n=4++n; n=5 k=5return ++i; i=5}}③public T(String str){System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); 6:t2 i=5 n=5 ++n; n=6 k=6++i; i=6}i = print("i");print方法代碼如下:public static int print(String str){System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); 7:i i=6 n=6++n; n=7 k=7return ++i; i=7}n = 99;* (2)靜態(tài)代碼塊* static{print("靜態(tài)塊");print方法代碼如下:public static int print(String str){System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); 8:靜態(tài)塊 i=7 n=99++n; n=100 k=8return ++i; i=8}}*/
10、閱讀代碼,分析運行結(jié)果
考核點:類初始化,局部變量與類變量,自增自減
public class Exercise10 {static int x, y, z;static {int x = 5;x--;}static {x--;}public static void main(String[] args) {System.out.println("x=" + x);z--;method();System.out.println("result:" + (z + y + ++z));}public static void method() {y = z++ + ++z;}
}
11、閱讀代碼,分析運行結(jié)果
考核點:類初始化與實例初始化
class HelloA{public HelloA(){System.out.println("HelloA");}{System.out.println("I'm A Class");}static{System.out.println("static A");}
}public class HelloB extends HelloA{public HelloB(){System.out.println("HelloB");}{System.out.println("I'm B Class");}static{System.out.println("static B");}public static void main(String[] args) {new HelloB();}
}
12、閱讀代碼,分析運行結(jié)果
知識點:實例初始化
class HelloA{public HelloA(){System.out.println("HelloA");}{System.out.println("I'm A Class");}
}class HelloB extends HelloA{public HelloB(){System.out.println("HelloB");}{System.out.println("I'm B Class");}
}
public class Exercise12{public static void main(String[] args) {new HelloB();}
}
/** 創(chuàng)建對象是通過執(zhí)行實例初始化方法來完成的。* 如果new后面跟無參構(gòu)造,就說明調(diào)用無參的實例初始化方法<init>(),* 如果new后面跟有參構(gòu)造,就說明調(diào)用有參的實例初始化方法<init>(形參列表)。* 編譯器編譯后類中沒有構(gòu)造器,而是編譯為一個個的實例初始化方法。* 實例初始化由:* (1)非靜態(tài)成員變量的顯式賦值代碼* (2)非靜態(tài)代碼塊代碼* (3)構(gòu)造器代碼* 其中(1)(2)按編寫順序,(3)在最后* 在子類實例初始化首行會有super()或super(實參列表)表示調(diào)用父類的實例初始化方法,* 如果沒寫super()或super(實參列表),那么默認(rèn)就是super(),因此:* (1)先執(zhí)行父類實例初始化* <init>(){* System.out.println("I'm A Class");* System.out.println("HelloA");* }* (2)再執(zhí)行子類實例初始化* <init>(){* System.out.println("I'm B Class");* System.out.println("HelloB");* }*/
13、閱讀代碼,分析運行結(jié)果
知識點:實例初始化
public class Exercise13 {public static void main(String[] args) {Sub s = new Sub();}
}
class Base{Base(){method(100);}{System.out.println("base");}public void method(int i){System.out.println("base : " + i);}
}
class Sub extends Base{Sub(){super.method(70);}{System.out.println("sub");}public void method(int j){System.out.println("sub : " + j);}
}
/** 創(chuàng)建對象是通過執(zhí)行實例初始化方法來完成的。* 如果new后面跟無參構(gòu)造,就說明調(diào)用無參的實例初始化方法<init>(),* 如果new后面跟有參構(gòu)造,就說明調(diào)用有參的實例初始化方法<init>(形參列表)。* 編譯器編譯后類中沒有構(gòu)造器,而是編譯為一個個的實例初始化方法。* 實例初始化由:* (1)非靜態(tài)成員變量的顯式賦值代碼* (2)非靜態(tài)代碼塊代碼* (3)構(gòu)造器代碼* 其中(1)(2)按編寫順序,(3)在最后* 在子類實例初始化首行會有super()或super(實參列表)表示調(diào)用父類的實例初始化方法,* 如果沒寫super()或super(實參列表),那么默認(rèn)就是super(),因此:* 1、執(zhí)行父類的實例初始化方法* <ini>(){* System.out.println("base");* method(100); //因為此時在創(chuàng)建子類的對象過程中,所以這個method(100)方法是* 子類對象再調(diào)用,那么又因為子類重寫了method(int)方法,* 所以執(zhí)行子類的method(int)* 即System.out.println("sub : " + j);* }* * 2、執(zhí)行子類的實例初始化方法* <init>(){* System.out.println("sub");* super.method(70);//因為這里用super.,那么一定是調(diào)用父類的method(int)* 即System.out.println("base : " + i);* }*/
14、閱讀代碼,分析運行結(jié)果
public class Exercise14 {public static void main(String[] args) {Son son = new Son();}
}
class Father{static{System.out.println("(1)父類的靜態(tài)代碼塊");}{System.out.println("(2)父類的非靜態(tài)代碼塊");}Father(){System.out.println("(3)父類的無參構(gòu)造");}
}
class Son extends Father{static{System.out.println("(4)子類的靜態(tài)代碼塊");}{System.out.println("(5)子類的非靜態(tài)代碼塊");}Son(){System.out.println("(6)子類的無參構(gòu)造");}
}
/** (1)Father類的類初始化* ①類變量顯式賦值:這里沒有* ②靜態(tài)代碼塊* System.out.println("(1)父類的靜態(tài)代碼塊");* (2)Son類的類初始化* ①類變量顯式賦值:這里沒有* ②靜態(tài)代碼塊* System.out.println("(4)子類的靜態(tài)代碼塊");* * (3)執(zhí)行Father類的是實參初始化方法<init>()* ①非靜態(tài)成員變量的顯式賦值:這里沒有* ②非靜態(tài)代碼塊:* System.out.println("(2)父類的非靜態(tài)代碼塊");* ③父類的無參構(gòu)造* System.out.println("(3)父類的無參構(gòu)造");* * (4)執(zhí)行Son類的實例初始化方法<init>()* ①非靜態(tài)成員變量的顯式賦值:這里沒有* ②非靜態(tài)代碼塊:* System.out.println("(5)子類的非靜態(tài)代碼塊");* ③子類的無參構(gòu)造* System.out.println("(6)子類的無參構(gòu)造");*/
15、閱讀代碼,分析運行結(jié)果
public class Exercise15 {public static void main(String[] args) {Zi zi = new Zi();}
}
class Fu{private static int i = getNum("(1)i");private int j = getNum("(2)j");static{print("(3)父類靜態(tài)代碼塊");}{print("(4)父類非靜態(tài)代碼塊,又稱為構(gòu)造代碼塊");}Fu(){print("(5)父類構(gòu)造器");}public static void print(String str){System.out.println(str + "->" + i);}public static int getNum(String str){print(str);return ++i;}
}
class Zi extends Fu{private static int k = getNum("(6)k");private int h = getNum("(7)h");static{print("(8)子類靜態(tài)代碼塊");}{print("(9)子類非靜態(tài)代碼塊,又稱為構(gòu)造代碼塊");}Zi(){print("(10)子類構(gòu)造器");}public static void print(String str){System.out.println(str + "->" + k);}public static int getNum(String str){print(str);return ++k;}
}
/** (1)Fu類的類初始化* ①類變量顯式賦值:* i = getNum("(1)i");* public static int getNum(String str){print(str);print方法代碼如下:public static void print(String str){System.out.println(str + "->" + i); (1)i -> 0(默認(rèn)值)}return ++i; i=1}* ②靜態(tài)代碼塊* static{print("(3)父類靜態(tài)代碼塊");print方法代碼如下:public static void print(String str){System.out.println(str + "->" + i); (3)父類靜態(tài)代碼塊 -> 1}}* (2)Zi類的類初始化* ①類變量顯式賦值:* k = getNum("(6)k");* public static int getNum(String str){print(str);print方法代碼如下:public static void print(String str){System.out.println(str + "->" + k); (6)k -> 0(默認(rèn)值)}return ++k; k=1}* ②靜態(tài)代碼塊* static{print("(8)子類靜態(tài)代碼塊");print方法代碼如下:public static void print(String str){System.out.println(str + "->" + k); (8)子類靜態(tài)代碼塊 -> 1}} * * (3)執(zhí)行Fu類的是實參初始化方法<init>()* ①非靜態(tài)成員變量的顯式賦值:* j = getNum("(2)j");* public static int getNum(String str){print(str);print方法代碼如下:public static void print(String str){System.out.println(str + "->" + i); (2)j -> 1}return ++i; i=2}* ②非靜態(tài)代碼塊:* {print("(4)父類非靜態(tài)代碼塊,又稱為構(gòu)造代碼塊");print方法代碼如下:public static void print(String str){System.out.println(str + "->" + i); (4)父類非靜態(tài)代碼塊,又稱為構(gòu)造代碼塊 -> 2}} * ③父類的無參構(gòu)造* Fu(){print("(5)父類構(gòu)造器");print方法代碼如下:public static void print(String str){System.out.println(str + "->" + i); (5)父類構(gòu)造器 -> 2}} * * (4)執(zhí)行Zi類的實例初始化方法<init>()* ①非靜態(tài)成員變量的顯式賦值:* h = getNum("(7)h");public static int getNum(String str){print(str);print方法代碼如下:public static void print(String str){System.out.println(str + "->" + k); (7)h ->1}return ++k; k=2}* * ②非靜態(tài)代碼塊:* {print("(9)子類非靜態(tài)代碼塊,又稱為構(gòu)造代碼塊");print方法代碼如下:public static void print(String str){System.out.println(str + "->" + k); (9)子類非靜態(tài)代碼塊,又稱為構(gòu)造代碼塊 ->2}} * ③子類的無參構(gòu)造* Zi(){print("(10)子類構(gòu)造器");print方法代碼如下:public static void print(String str){System.out.println(str + "->" + k); (10)子類構(gòu)造器 ->2}} */
16、閱讀代碼,分析運行結(jié)果
public class Exercise16{public static void main(String[] args){Son s1 = new Son();//找到就是Son類的<init>()}
}
class Father{private int a = getNumber();{System.out.println("Father非靜態(tài)代碼塊 a = " + a);}Father(){System.out.println("Father()無參構(gòu)造");}public int getNumber(){System.out.println("Father:getNumber()");return 1;}
}
class Son extends Father{{System.out.println("Son非靜態(tài)代碼");}public Son(){System.out.println("Son():無參構(gòu)造");}public int getNumber(){System.out.println("Son:getNumber()");return 2;}
}
/*
class Father{private int a;<init>(){//super();//這里可以忽略它,因為Father類的父類是Object,它沒有輸出語句,不用管它a = getNumber();System.out.println("Father非靜態(tài)代碼塊 a = " + a);System.out.println("Father()無參構(gòu)造");}public int getNumber(){System.out.println("Father:getNumber()");return 1;}
}class Son extends Father{<init>(){super();//它代表Father類<init>()System.out.println("Son非靜態(tài)代碼");System.out.println("Son():無參構(gòu)造");}public int getNumber(){System.out.println("Son:getNumber()");return 2;}
}代碼最終執(zhí)行:a = getNumber(); //因為我們現(xiàn)在在newSon類的對象,所以對象的運行時是Son類,//而getNumber是虛方法,所以要看子類重寫后的getNumberSystem.out.println("Son:getNumber()");return 2;System.out.println("Father非靜態(tài)代碼塊 a = " + a);System.out.println("Father()無參構(gòu)造");System.out.println("Son非靜態(tài)代碼");System.out.println("Son():無參構(gòu)造");*/
17、閱讀代碼,分析運行結(jié)果
public class Exercise17 {public static void main(String[] args) {Sub s = new Sub();}
}
class Base{Base(){this.method(100);}{System.out.println("base");}public void method(int i){System.out.println("base : " + i);}
}
class Sub extends Base{Sub(){super.method(70);}{System.out.println("sub");}public void method(int j){//是重寫,雖然參數(shù)名不一樣,但是參數(shù)的類型和個數(shù)一樣,方法名也一樣是重寫System.out.println("sub : " + j);}
}
/*
先對類進(jìn)行組裝分析:
class Base{<init>() {//super(); 本題中可以忽略System.out.println("base");this.method(100);}public void method(int i){System.out.println("base : " + i);}
}class Sub extends Base{<init>(){super();//這句話,要時刻記得它System.out.println("sub");super.method(70);}public void method(int j){System.out.println("sub : " + j);}
}執(zhí)行的代碼是:System.out.println("base");this.method(100);//method是虛方法,我們現(xiàn)在在newSub類對象,所以執(zhí)行重寫的methodSystem.out.println("sub : " + j);System.out.println("sub");super.method(70); //method雖然是虛方法,但是這里有明確說執(zhí)行父類被重寫的method,因為前面有super.System.out.println("base : " + i);*/
03-關(guān)鍵字:final
18.代碼閱讀題
public class Exercise18 {public static void main(String[] args) {Other o = new Other();new TestOther().addOne(o);/*(1)new TestOther():匿名對象,作用是為了調(diào)用addOne方法。(2)上面的實參o,把Other對象的地址值,傳給了下面的addOne方法的形參o(3)下面的addOne方法的形參o,前面有一個final修飾,這個final在這里的意思是,形參o不能夠指向新的對象,這就意味著,形參和實參此時一定是指向同一個對象。(4)如果形參和實參指向同一個對象,那么形參對象屬性值的修改,其實就是實參對象屬性值的修改*/System.out.println(o.i);//1}public void addOne(final Other o){
// o = new Other();//錯誤,o不能重新賦值o.i++;}
}
class Other{public int i; //如果i前面有final,才是表示i的值不能被修改
}
04-抽象類和抽象方法
19、numa、numb、numc輸出
編寫代碼,效果如圖所示:
編寫步驟:
- 定義抽象類A,抽象類B繼承A,普通類C繼承B
- A類中,定義成員變量numa,賦值為10,抽象showA方法。
- B類中,定義成員變量numb,賦值為20,抽象showB方法。
- C類中,定義成員變量numc,賦值為30,重寫showA方法,打印numa,重寫showB方法,打印numb,定義showC方法,打印numc。
- 測試類Exercise19中,創(chuàng)建C對象,調(diào)用showA方法,showB方法,showC方法。
public class Exercise19 {public static void main(String[] args) {C c = new C();c.showA();c.showB();c.showC();}
}
abstract class A{protected int numa = 10;public abstract void showA();
}
abstract class B extends A{protected int numb = 20;public abstract void showB();
}
class C extends B{private int numc = 30;@Overridepublic void showB() {System.out.println("B類中numb:" + numb);}@Overridepublic void showA() {System.out.println("A類中numa:" + numa);}public void showC(){System.out.println("C類中numc:" + numc);}
}
20、Woman類、Man類等
案例:
? 1、聲明抽象父類Person,包含抽象方法public abstract void coiffure();
? 2、聲明子類Woman,重寫抽象方法,打印留短發(fā)
? 3、聲明子類Man,重寫抽象方法,打印留長發(fā)
? 4、聲明測試類Exercise20,創(chuàng)建Person數(shù)組,存放Woman和Man對象,并遍歷數(shù)組,調(diào)用coiffure()方法
public abstract class Person {public abstract void coiffure();
}
public class Man extends Person{@Overridepublic void coiffure() {System.out.println("男人留短發(fā)");}
}
public class Woman extends Person{@Overridepublic void coiffure() {System.out.println("女人留長發(fā)");}
}
public class Exercise20 {public static void main(String[] args) {Person[] all = new Person[2];all[0] = new Woman();all[1] = new Man();for (int i = 0; i < all.length; i++) {all[i].coiffure();}}
}
21、Chinese、American等
案例:
? 1、聲明抽象父類Person,包含抽象方法public abstract void eat();
? 2、聲明子類中國人Chinese,重寫抽象方法,打印用筷子吃飯
? 3、聲明子類美國人American,重寫抽象方法,打印用刀叉吃飯
? 4、聲明子類印度人Indian,重寫抽象方法,打印用手抓飯
? 5、聲明測試類Test11,創(chuàng)建Person數(shù)組,存儲各國人對象,并遍歷數(shù)組,調(diào)用eat()方法
public class Exercise21 {public static void main(String[] args) {Person[] all = new Person[3];all[0] = new Chinese();all[1] = new American();all[2] = new Indian();for (int i = 0; i < all.length; i++) {all[i].eat();}}
}
abstract class Person{public abstract void eat();
}
class Chinese extends Person{@Overridepublic void eat() {System.out.println("中國人用筷子吃飯");}}
class American extends Person{@Overridepublic void eat() {System.out.println("美國人用刀叉吃飯");}}
class Indian extends Person{@Overridepublic void eat() {System.out.println("印度人用手抓飯");}}
22、幾何圖形類
(1)聲明一個抽象圖形父類Shape,包含
- public abstract double area()
- public abstract double perimeter()
- public String toString():返回“面積:xxx,周長:xxx”
(2)聲明一個矩形Rectangle,繼承Shape父類
- 屬性:長和寬,私有化
- 提供get/set
- 提供無參構(gòu)造和有參構(gòu)造
- 重寫area()和perimeter方法,
- 重寫toString方法,返回“長:xx,寬:xx,面積:xxx,周長:xxx”
(3)聲明一個三角形Triangle,繼承Shape父類
- 屬性:a,b,c分別代表三角形的三邊,私有化
- 提供get/set
- 提供有參構(gòu)造,public Triangle(double a, double b, double c),并驗證a,b,c的值是否可以構(gòu)成三角形,如果可以構(gòu)成三角形再為a,b,c的屬性賦值
- 重寫area()和perimeter方法,
- 重寫toString方法,返回“邊長:xx,xx,xx,面積:xxx,周長:xxx”
(4)在測試類中:
- 創(chuàng)建兩個矩形(2,3)、(3,6),創(chuàng)建2個三角形(3,4,5)、(6,6,6)
- 創(chuàng)建Shape數(shù)組中,把上面4個對象放到數(shù)組中,遍歷顯示信息
public abstract class Shape {public abstract double area();public abstract double perimeter();public String toString(){return "面積:" + area() +",周長:" + perimeter();}
}
public class Rectangle extends Shape {private double length;private double width;public Rectangle() {}public Rectangle(double length, double width) {this.length = length;this.width = width;}public double getLength() {return length;}public void setLength(double length) {this.length = length;}public double getWidth() {return width;}public void setWidth(double width) {this.width = width;}@Overridepublic double area() {return length * width;}@Overridepublic double perimeter() {return 2 * (length + width);}@Overridepublic String toString() {return "長:" + length +", 寬" + width +"," + super.toString();}
}
public class Triangle extends Shape {private double a;private double b;private double c;public Triangle() {}public Triangle(double a, double b, double c) {if(a>0 && b> 0 && c>0 && a+b>c && b+c>a && a+c>b) {this.a = a;this.b = b;this.c = c;}}public double getA() {return a;}public void setA(double a) {this.a = a;}public double getB() {return b;}public void setB(double b) {this.b = b;}public double getC() {return c;}public void setC(double c) {this.c = c;}@Overridepublic double area() {double p = (a+b+c)/2;return Math.sqrt(p * (p-a) * (p-b) *(p-c));}@Overridepublic double perimeter() {return a+b+c;}@Overridepublic String toString() {return "邊長:" + a +"," + b +"," + c +"," + super.toString();}
}
public class Exercise22 {public static void main(String[] args) {Shape[] arr = new Shape[4];arr[0] = new Rectangle(2,3);arr[1] = new Rectangle(3,6);arr[2] = new Triangle(3,4,5);arr[3] = new Triangle(6,6,6);for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}
}
23、交通工具
(1)聲明抽象類Vehicle交通工具
- 包含私有的int類型的屬性wheels,代表輪子的數(shù)量
- 包含有參構(gòu)造Vehicle(int wheels)
- 包含抽象方法public abstract void drive()
- 重寫toString():返回輪子的數(shù)量
(2)聲明子類Monocycle單輪車
- 重寫抽象方法drive,輸出“腳踏獨輪車,搖搖擺擺往前走”
(3)聲明子類Bicycle自行車
- 重寫抽象方法drive,輸出“腳踏雙輪自行車,優(yōu)哉游哉往前走”
(4)聲明子類Tricycle三輪車
- 重寫抽象方法drive,輸出“腳踏三輪車,穩(wěn)穩(wěn)當(dāng)當(dāng)往前走“
(5)測試類
- 創(chuàng)建幾個交通工具的對象,打印對象并調(diào)用drive方法
/*
(1)聲明抽象類Vehicle交通工具- 包含int類型的wheels代表輪子的數(shù)量
- 包含有參構(gòu)造Vehicle(int wheels)
- 包含抽象方法public abstract void drive()*/
public abstract class Vehicle {private int wheels;public Vehicle(int wheels) {this.wheels = wheels;}public int getWheels() {return wheels;}public void setWheels(int wheels) {this.wheels = wheels;}public abstract void drive();@Overridepublic String toString() {return "Vehicle{" +"wheels=" + wheels +'}';}
}
public class Monocycle extends Vehicle {public Monocycle(int wheels) {super(wheels);}@Overridepublic void drive() {System.out.println("腳踏獨輪車,搖搖擺擺往前走");}
}
public class Bicycle extends Vehicle {public Bicycle(int wheels) {super(wheels);}@Overridepublic void drive() {System.out.println("腳踏雙輪自行車,優(yōu)哉游哉往前走");}
}
public class Tricycle extends Vehicle {public Tricycle(int wheels) {super(wheels);}@Overridepublic void drive() {System.out.println("腳踏三輪車,穩(wěn)穩(wěn)當(dāng)當(dāng)往前走");}
}
public class Exercise23 {public static void main(String[] args) {Vehicle[] arr = new Vehicle[3];arr[0] = new Monocycle(1);arr[1] = new Bicycle(2);arr[2] = new Tricycle(3);for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);arr[i].drive();}}
}
05-接口
24、代碼閱讀題
interface A{int x = 0;
}
class B{int x = 1;
}
class C extends B implements A{public void printX(){System.out.println(x);}public static void main(String[] args) {new C().printX();}
}
//編譯不通過,因為在C類中x有歧義。
interface A{int x = 0;
}
class B{int x = 1;
}
class C extends B implements A{public void printX(){
// System.out.println(x);//有歧義,要么寫super.x,要么下A.x}public static void main(String[] args) {new C().printX();}
}
25、代碼閱讀題
interface A {int x = 0;
}
class B {int x = 1;
}
class C extends B implements A {public void pX() {System.out.println(x);}public static void main(String[] args) {new C().pX();}
}
26、代碼閱讀題
interface Playable {void play();
}interface Bounceable {void play();
}interface Rollable extends Playable, Bounceable {Ball ball = new Ball("PingPang");}class Ball implements Rollable {private String name;public String getName() {return name;}public Ball(String name) {this.name = name;}public void play() {ball = new Ball("Football");System.out.println(ball.getName());}
}
27、FightAble接口
- 模擬玩家選擇角色。
- 定義接口FightAble:
- 抽象方法:specialFight。
- 默認(rèn)方法:commonFight,方法中打印"普通打擊"。
- 定義戰(zhàn)士類:
- 實現(xiàn)FightAble接口,重寫方法中打印"武器攻擊"。
- 定義法師類Mage:
- 實現(xiàn)FightAble接口,重寫方法中打印"法術(shù)攻擊"。
- 定義玩家類Player:
- 靜態(tài)方法:FightAble select(String str),根據(jù)指令選擇角色。
- 法力角色,選擇法師。
- 武力角色,選擇戰(zhàn)士。
- 靜態(tài)方法:FightAble select(String str),根據(jù)指令選擇角色。
- 代碼實現(xiàn),效果如圖所示:
public class Exercise27 {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.print("選擇:");String role1 = input.next();FightAble f1 = Player.select(role1);f1.specialFight();f1.commonFight();System.out.println("====================");System.out.print("選擇:");String role2 = input.next();FightAble f2 = Player.select(role2);f2.specialFight();f2.commonFight();input.close();}
}
interface FightAble{void specialFight();default void commonFight(){System.out.println("普通攻擊");}
}
class Soldier implements FightAble{@Overridepublic void specialFight() {System.out.println("武器攻擊");}}
class Mage implements FightAble{@Overridepublic void specialFight() {System.out.println("法術(shù)攻擊");}}
class Player{public static FightAble select(String str){if("法力角色".equals(str)){return new Mage();}else if("武力角色".equals(str)){return new Soldier();}return null;}}
28、CompareAble接口
- 模擬工人挑蘋果。
- 定義蘋果類:
- 屬性:大小,顏色。
- 提供基本的構(gòu)造方法和get方法,set方法
- 定義接口CompareAble:
- 定義默認(rèn)方法compare,挑選較大蘋果。
- 定義接口實現(xiàn)類CompareBig。
- 定義接口實現(xiàn)類CompareColor。挑選紅色蘋果。
- 定義工人類:
- 成員方法:挑選蘋果public void pickApple(CompareAble c,Apple a1,Apple a2)。
- 測試類:
- 創(chuàng)建Worker對象。
- 創(chuàng)建兩個Apple對象,一個Apple(5,“青色”),一個Apple(3,“紅色”)
- 代碼實現(xiàn),效果如圖所示:
public class Exercise28 {public static void main(String[] args) {Worker w = new Worker();Apple a1 = new Apple(5, "青色");Apple a2 = new Apple(3, "紅色");w.pickApple(new CompareBig(), a1, a2);w.pickApple(new CompareColor(), a1, a2);}
}
class Apple{private double size;private String color;public Apple(double size, String color) {super();this.size = size;this.color = color;}public Apple() {super();}public double getSize() {return size;}public void setSize(double size) {this.size = size;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}@Overridepublic String toString() {return size + "-" + color;}}
interface CompareAble{default void compare(Apple a1,Apple a2){System.out.println("默認(rèn)挑大的:");if(a1.getSize() > a2.getSize()){System.out.println(a1);}else{System.out.println(a2);}}
}
class CompareBig implements CompareAble{}
class CompareColor implements CompareAble{@Overridepublic void compare(Apple a1, Apple a2) {System.out.println("挑紅的:");if("紅色".equals(a1.getColor())){System.out.println(a1);}if("紅色".equals(a2.getColor())){System.out.println(a2);}}}
class Worker{public void pickApple(CompareAble c,Apple a1,Apple a2){c.compare(a1, a2);}
}
29、Filter接口
- 模擬接待員接待用戶,根據(jù)用戶id,給用戶分組。
- 定義用戶類:
- 屬性:用戶類型,用戶id
- 提供基本的構(gòu)造方法和get方法,set方法
- 定義接口Filter:
- 提供抽象方法filterUser(User u)
- 定義實現(xiàn)類V1Filter,實現(xiàn)抽象方法,將用戶設(shè)置為v1
- 定義實現(xiàn)類V2Filter,實現(xiàn)抽象方法,將用戶設(shè)置為v2
- 定義實現(xiàn)類AFilter,實現(xiàn)抽象方法,將用戶設(shè)置為A
- 定義接待員類Receptionist:
- 屬性:接口Filter
- 提供基本的構(gòu)造方法和get方法,set方法
- 成員方法:接待用戶方法,設(shè)置用戶類型。
- 測試類:
- 初始化15個User對象,id為1-15。
- 創(chuàng)建三個接待員對象。
- 第一個接待員,設(shè)置接待規(guī)則,將1-5號用戶類型設(shè)置為v1。
- 第二個接待員,設(shè)置接待規(guī)則,將6-10號用戶類型設(shè)置為v2。
- 第三個接待員,設(shè)置接待規(guī)則,將11-15號用戶類型設(shè)置為A。
- 遍歷數(shù)組,給用戶分區(qū)。
- 代碼實現(xiàn),效果如圖所示:
class Exercise29 {public static void main(String[] args) {User[] all = new User[15];for (int i = 0; i < all.length; i++) {all[i] = new User(null,i+1);}V1Filter v1F = new V1Filter();V2Filter v2F = new V2Filter();AFilter aF = new AFilter();Receptionist r1 = new Receptionist(v1F);for (int i = 0; i < 5; i++) {r1.recept(all[i]);}Receptionist r2 = new Receptionist(v2F);for (int i = 5; i < 10; i++) {r2.recept(all[i]);}Receptionist r3 = new Receptionist(aF);for (int i = 10; i < 15; i++) {r3.recept(all[i]);}for (int i = 0; i < all.length; i++) {System.out.println(all[i]);}}
}
class User{private String type;private int id;public User(String type, int id) {super();this.type = type;this.id = id;}public String getType() {return type;}public void setType(String type) {this.type = type;}public int getId() {return id;}public void setId(int id) {this.id = id;}@Overridepublic String toString() {return id + "-" + type;}
}
interface Filter{void filterUser(User u);
}class V1Filter implements Filter{@Overridepublic void filterUser(User u) {u.setType("v1");}}
class V2Filter implements Filter{@Overridepublic void filterUser(User u) {u.setType("v2");}}
class AFilter implements Filter{@Overridepublic void filterUser(User u) {u.setType("A");}}class Receptionist{private Filter filter;public Receptionist(Filter filter) {super();this.filter = filter;}public Filter getFilter() {return filter;}public void setFilter(Filter filter) {this.filter = filter;}public void recept(User u){if(u.getType() != null){return ;}filter.filterUser(u);}
}
30、LiveAble接口
1、聲明一個LiveAble接口
- 包含兩個抽象方法:
- void eat();
- void breathe();
- 包含默認(rèn)方法 default void sleep(),實現(xiàn)為打印“靜止不動”
- 包含靜態(tài)方法 static void drink(),實現(xiàn)為“喝水”
2、聲明動物Animal類,實現(xiàn)LiveAble接口。
- void eat();實現(xiàn)為“吃東西”,
- void breathe();實現(xiàn)為"吸入氧氣呼出二氧化碳"
- void sleep()重寫為”躺下閉上眼睛睡覺"
3、聲明植物Plant類,實現(xiàn)LiveAble接口。
- void eat();實現(xiàn)為“吸收營養(yǎng)”
- void breathe();實現(xiàn)為"吸入二氧化碳呼出氧氣"
4、在測試類中,分別創(chuàng)建兩個實現(xiàn)類的對象,調(diào)用對應(yīng)的方法。通過接口名調(diào)用靜態(tài)方法
public interface LiveAble {// 定義抽象方法void eat();void breathe();//定義默認(rèn)方法default void sleep(){System.out.println("靜止不動");}//定義靜態(tài)方法static void drink(){System.out.println("喝水");}
}
public class Animal implements LiveAble {//重寫/實現(xiàn)接口的抽象方法@Overridepublic void eat() {System.out.println("吃東西");}//重寫/實現(xiàn)接口的抽象方法@Overridepublic void breathe(){System.out.println("吸入氧氣呼出二氧化碳");}//重寫接口的默認(rèn)方法@Overridepublic void sleep() {System.out.println("躺下閉上眼睛睡覺");}
}
public class Plant implements LiveAble {//重寫/實現(xiàn)接口的抽象方法@Overridepublic void eat() {System.out.println("吸收營養(yǎng)");}//重寫/實現(xiàn)接口的抽象方法@Overridepublic void breathe(){System.out.println("吸入二氧化碳呼出氧氣");}
}
public class Exercise30 {public static void main(String[] args) {// 創(chuàng)建實現(xiàn)類(子類)對象Animal a = new Animal();// 調(diào)用實現(xiàn)后的方法a.eat();a.sleep();a.breathe();//創(chuàng)建實現(xiàn)類(子類)對象Plant p = new Plant();p.eat();p.sleep();p.breathe();//通過接口調(diào)用靜態(tài)方法LiveAble.drink();}
}
31、Runner、Swimming接口
(1)聲明第一個接口Runner,包含抽象方法:void run()
(2)聲明第二個接口Swimming,包含抽象方法:void swim()
(3)聲明兔子類,實現(xiàn)Runner接口,
- 重寫run(),實現(xiàn)為“兔子跑的快”
(4)聲明烏龜類
-
實現(xiàn)Runner接口,重寫run(),實現(xiàn)為“烏龜跑的快”
-
實現(xiàn)Swimming接口,重寫swim()方法,實現(xiàn)為“烏龜游的快”
(5)測試類中創(chuàng)建兔子和烏龜類的對象,并調(diào)用相應(yīng)方法
public interface Runner{void run();
}
public interface Swimming {void swim();
}
public class Rabbit implements Runner {@Overridepublic void run() {System.out.println("兔子跑得快");}
}
public class Tortoise implements Runner,Swimming{@Overridepublic void swim() {System.out.println("烏龜游得快");}@Overridepublic void run() {System.out.println("烏龜跑的慢");}}
public class Exercise31 {public static void main(String[] args) {Rabbit r = new Rabbit();r.run();Tortoise t = new Tortoise();t.run();t.swim();}
}
32、A、B接口
- 編寫代碼,效果如圖所示:
- 編寫步驟:
- 定義接口A,普通類B實現(xiàn)接口A
- A接口中,定義抽象方法showA。
- A接口中,定義默認(rèn)方法showB。
- B類中,重寫showA方法
- 測試類中,創(chuàng)建B類對象,調(diào)用showA方法,showB方法。
public class Exercise32 {public static void main(String[] args) {B b = new B();b.showA();b.showB();}
}
interface A{void showA();default void showB(){System.out.println("BBB");}
}
class B implements A{@Overridepublic void showA() {System.out.println("AAA");}}
33、Universe接口
- 編寫代碼,效果如圖所示:
- 編寫步驟
-
定義接口Universe,提供抽象方法doAnything。
-
定義普通類Star,提供成員發(fā)光shine方法,打印“star:星星一閃一閃亮晶晶"
-
定義普通類Sun,
繼承Star類,重寫shine方法,打印"sun:光照八分鐘,到達(dá)地球"
實現(xiàn)Universe接口,實現(xiàn)doAnything,打印"sun:太陽吸引著9大行星旋轉(zhuǎn)"
-
測試類中,創(chuàng)建Star對象,調(diào)用shine方法
-
測試類中,多態(tài)的方式創(chuàng)建Sun對象,調(diào)用doAnything方法,向下轉(zhuǎn)型,調(diào)用shine方法。
public class Exercise33 {public static void main(String[] args) {Star s = new Star();s.shine();System.out.println("======================");Universe u = new Sun();u.doAnything();Star sun = (Star) u;sun.shine();}
}
interface Universe{void doAnything();
}
class Star{public void shine(){System.out.println("star:星星一閃一閃亮晶晶");}
}
class Sun extends Star implements Universe{@Overridepublic void shine(){System.out.println("sun:光照8分鐘到達(dá)地球");}@Overridepublic void doAnything() {System.out.println("sun:太陽吸引著9大行星旋轉(zhuǎn)");}}
34、Flyable、Swimming接口
(1)聲明Flyable接口
- 包含抽象方法void fly()方法
(2)聲明Swimming接口
- 包含抽象方法void swim()方法
(3)聲明類Bird
- 聲明抽象方法:public abstract void eat()
(4)聲明子類Penguin企鵝
- 繼承Bird類,重寫eat方法,輸出"企鵝吃南極磷蝦"
- 實現(xiàn)Swimming接口,重寫swim()方法,輸出“企鵝下海捉蝦”
(5)聲明子類Swan天鵝
- 繼承Bird類,重寫eat方法,輸出“天鵝吃水生植物的根莖和種子、水生昆蟲、螺類和小魚”
- 實現(xiàn)Flyable接口,重寫fly方法,輸出“天鵝展翅高飛,天南海北任我游”
- 實現(xiàn)Swimming接口,重寫swim()方法,輸出“天鵝把羽毛洗的锃亮,順便捉條魚”
(6)聲明子類Chicken雞
- 繼承Bird類,重寫eat方法,輸出“雞吃谷子”
- 實現(xiàn)Flyable接口,重寫fly方法,輸出“雞上房揭瓦,滿院子亂撲騰"
(7)測試類
- 創(chuàng)建Bird數(shù)組,并且把Penguin企鵝、Swan天鵝、Chicken雞的對象放到Bird數(shù)組中,遍歷數(shù)組
- 調(diào)用各個元素的eat方法
- 如果會飛的調(diào)用fly方法(提示:可以使用instanceof判斷)
- 如果會游的調(diào)用swim方法
public interface Flyable {void fly();
}
public interface Swimming {void swim();
}
public abstract class Bird {public abstract void eat();
}
public class Penguin extends Bird implements Swimming {@Overridepublic void eat() {System.out.println("企鵝吃南極磷蝦");}@Overridepublic void swim() {System.out.println("企鵝下海捉蝦");}
}
public class Swan extends Bird implements Flyable,Swimming {@Overridepublic void eat() {System.out.println("天鵝吃水生植物的根莖和種子、水生昆蟲、螺類和小魚");}@Overridepublic void fly() {System.out.println("天鵝展翅高飛,天南海北任我游");}@Overridepublic void swim() {System.out.println("天鵝把羽毛洗的锃亮,順便捉條魚");}
}
public class Chicken extends Bird implements Flyable{@Overridepublic void eat() {System.out.println("雞吃谷子");}@Overridepublic void fly() {System.out.println("雞上房揭瓦,滿院子亂撲騰");}
}
public class Exercise34 {public static void main(String[] args) {Bird[] birds = new Bird[3];birds[0] = new Penguin();birds[1] = new Swan();birds[2] = new Chicken();for (int i = 0; i < birds.length; i++) {birds[i].eat();if(birds[i] instanceof Flyable){Flyable f = (Flyable) birds[i];f.fly();}if(birds[i] instanceof Swimming){Swimming s = (Swimming)birds[i];s.swim();}}}
}
35、Predicate接口
(1)已知在java.util.function包下有一個Predicate接口(這個接口不用寫)
- 包含抽象方法:boolean test(Object obj);
(2)聲明一個數(shù)組工具類ArrayTools,包含
- 靜態(tài)方法:public static void print(Object[] arr):使用for循環(huán)遍歷輸出數(shù)組元素
(3)聲明一個員工類Emloyee
- 包含屬性編號、姓名、年齡、薪資,私有化,
- 提供無參和有參構(gòu)造
- 提供get/set方法
- 重寫toString方法,返回員工對象的基本信息
(4)聲明一個員工管理類:EmployeeService,
-
包含private Employee[] arr并創(chuàng)建長度為5的數(shù)組
-
包含private int total,記錄arr中員工對象個數(shù)
-
包含public void add(Employee emp)方法,將emp對象添加到arr數(shù)組中,
-
包含public Employee[] get(Predicate p)方法,這個方法的作用就是在arr數(shù)組中篩選出滿足某個條件的員工對象。
- 要求遍歷arr數(shù)組,統(tǒng)計arr數(shù)組中有幾個元素通過p的test方法判斷返回true,假設(shè)count個
- 創(chuàng)建Emloyee[]數(shù)組result,長度為count,并把arr中滿足p的test方法條件的元素就添加到返回值的result數(shù)組中。
(5)在測試類中,創(chuàng)建EmployeeService對象,
- 調(diào)用add方法添加如下員工對象
new Employee(4, "李四", 24, 24000);
new Employee(3, "張三", 23, 13000);
new Employee(5, "王五", 25, 15000);
new Employee(1, "趙六", 27, 17000);
new Employee(2, "錢七", 16, 6000);
- 調(diào)用get(Predicate p)方法,通過匿名內(nèi)部類的對象給形參p賦值,分別實現(xiàn)獲取:
- 所有員工對象
- 所有年齡超過25的員工
- 所有薪資高于15000的員工
- 所有年齡超過25且薪資高于15000的員工
- 分別遍歷輸出
public class ArrayTools {public static void print(Object[] arr){for(int i = 0;i < arr.length;i++){System.out.println(arr[i]);}}
}
public class Employee {private int id;private String name;private int age;private double salary;public Employee() {}public Employee(int id, String name, int age, double salary) {this.id = id;this.name = name;this.age = age;this.salary = salary;}public int getId() {return id;}public void setId(int id) {this.id = id;}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 double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}@Overridepublic String toString() {return "Employee{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", salary=" + salary +'}';}
}
public class EmployeeService {private Employee[] arr = new Employee[5];private int total;public void add(Employee emp){if(total >= arr.length){System.out.println("數(shù)組已滿,無法添加");return;}arr[total++] = emp;}public Employee[] get(Predicate p){int count = 0;for (Employee employee : arr) {if(p.test(employee)){count++;}}Employee[] result = new Employee[count];count = 0;for (Employee employee : arr) {if(p.test(employee)){result[count++] = employee;}}return result;}
}
public class Exercise35 {public static void main(String[] args) {EmployeeService es = new EmployeeService();es.add(new Employee(4, "李四", 24, 24000));es.add(new Employee(3, "張三", 23, 13000));es.add(new Employee(5, "王五", 25, 15000));es.add(new Employee(1, "趙六", 27, 17000));es.add(new Employee(2, "錢七", 16, 6000));System.out.println("所有員工:");Employee[] all = es.get(new Predicate() {@Overridepublic boolean test(Object o) {return true;}});ArrayTools.print(all);System.out.println("--------------------------------");System.out.println("所有年齡超過25的員工:");all = es.get(new Predicate() {@Overridepublic boolean test(Object o) {return ((Employee)o).getAge()>25;}});ArrayTools.print(all);System.out.println("--------------------------------");System.out.println("所有薪資高于15000的員工:");all = es.get(new Predicate() {@Overridepublic boolean test(Object o) {Employee e = (Employee) o;return e.getSalary()>15000;}});ArrayTools.print(all);System.out.println("--------------------------------");System.out.println("所有年齡超過25且薪資高于15000的員工:");all = es.get(new Predicate() {@Overridepublic boolean test(Object o) {Employee e = (Employee) o;return e.getAge()>25 && e.getSalary()>15000;}});ArrayTools.print(all);}
}
06-內(nèi)部類
36、代碼閱讀題
public class Exercise36 {public static void main(String[] args) {Out out = new Out();out.Print(3);}
}
class Out {private int age = 12;public void Print(final int x) {class In {public void inPrint() {System.out.println(x);//3System.out.println(age);//12}}new In().inPrint();}
}
37、代碼閱讀題
public class Exercise37 {public static void main(String[] args) {Out.In in = new Out().new In();in.print();}
}
class Out {private int age = 12;class In {private int age = 13;public void print() {int age = 14;System.out.println("局部變量:" + age);//14System.out.println("內(nèi)部類變量:" + this.age);//13System.out.println("外部類變量:" + Out.this.age);//12}}
}
38、代碼閱讀題
public class Exercise38{public Exercise38(){Inner s1 = new Inner();s1.a = 10;Inner s2 = new Inner();s2.a = 20;Exercise38.Inner s3 = new Exercise38.Inner();System.out.println(s3.a);}class Inner{public int a = 5;}public static void main(String[] args) {Exercise38 t = new Exercise38();Inner r = t.new Inner();System.out.println(r.a);}
}
39、繼承Object匿名內(nèi)部類
編寫一個匿名內(nèi)部類,它繼承Object,并在匿名內(nèi)部類中,聲明一個方法public void print(),輸出尚硅谷。
請編寫代碼調(diào)用這個方法。
public class Exercise39 {public static void main(String[] args) {new Object(){public void print(){System.out.println("尚硅谷");}}.print();}
}
40、CompareAble接口匿名實現(xiàn)類
案例:將《05-接口第28題CompareAble接口》改用匿名內(nèi)部類實現(xiàn)接口,來代替CompareBig和CompareColor
public class Exercise40 {public static void main(String[] args) {Worker w = new Worker();Apple a1 = new Apple(5, "青色");Apple a2 = new Apple(3, "紅色");w.pickApple(new CompareAble(){}, a1, a2);w.pickApple(new CompareAble(){@Overridepublic void compare(Apple a1, Apple a2) {System.out.println("挑紅的:");if("紅色".equals(a1.getColor())){System.out.println(a1);}if("紅色".equals(a2.getColor())){System.out.println(a2);}}}, a1, a2);}
}
class Apple{private double size;private String color;public Apple(double size, String color) {super();this.size = size;this.color = color;}public Apple() {super();}public double getSize() {return size;}public void setSize(double size) {this.size = size;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}@Overridepublic String toString() {return size + "-" + color;}}
interface CompareAble{default void compare(Apple a1,Apple a2){System.out.println("默認(rèn)挑大的:");if(a1.getSize() > a2.getSize()){System.out.println(a1);}else{System.out.println(a2);}}
}
class Worker{public void pickApple(CompareAble c,Apple a1,Apple a2){c.compare(a1, a2);}
}
41、Filter接口匿名實現(xiàn)類
案例:將《05-接口第29題Filter接口》改用匿名內(nèi)部類實現(xiàn)接口,來代替V1Filter、V2Filter、AFilter
public class Exercise41 {public static void main(String[] args) {User[] all = new User[15];for (int i = 0; i < all.length; i++) {all[i] = new User(null,i+1);}Receptionist r1 = new Receptionist(new Filter(){@Overridepublic void filterUser(User u) {u.setType("v1");}});for (int i = 0; i < 5; i++) {r1.recept(all[i]);}Receptionist r2 = new Receptionist(new Filter(){@Overridepublic void filterUser(User u) {u.setType("v2");}});for (int i = 5; i < 10; i++) {r2.recept(all[i]);}Receptionist r3 = new Receptionist(new Filter(){@Overridepublic void filterUser(User u) {u.setType("A");}});for (int i = 10; i < 15; i++) {r3.recept(all[i]);}for (int i = 0; i < all.length; i++) {System.out.println(all[i]);}}
}
class User{private String type;private int id;public User(String type, int id) {super();this.type = type;this.id = id;}public String getType() {return type;}public void setType(String type) {this.type = type;}public int getId() {return id;}public void setId(int id) {this.id = id;}@Overridepublic String toString() {return id + "-" + type;}
}
interface Filter{void filterUser(User u);
}class Receptionist{private Filter filter;public Receptionist(Filter filter) {super();this.filter = filter;}public Filter getFilter() {return filter;}public void setFilter(Filter filter) {this.filter = filter;}public void recept(User u){if(u.getType() != null){return ;}filter.filterUser(u);}
}
42、Thread、Runnable的匿名實現(xiàn)類
(1)已知java.lang包下有一個Thread類(這個類不用寫),該類有:
- ①public Thread(String name)構(gòu)造器
- ②public Thread(Runnable target)構(gòu)造器
- ③public void run()方法
- ④public void start()方法
- ⑤public String getName()方法
(2)已知java.lang包下還有一個Runnable接口(這個接口不用寫),該接口有
- 抽象方法:public void run()
(3)測試類
- ①請用匿名內(nèi)部類的方式繼承Thread類,并顯示使用Thread(String name)構(gòu)造器,傳入實參“自己的姓名”,在匿名內(nèi)部類中重寫run方法,輸出“xx愛尚硅谷”,其中xx通過getName()方法獲取。同時調(diào)用Thread類匿名子類對象的start()方法。
- ②請用Thread(Runnable target)構(gòu)造器創(chuàng)建Thread類的對象,并且用匿名內(nèi)部類的方式實現(xiàn)Runnable接口,重寫run方法,輸出“尚硅谷愛我”。調(diào)用Thread類對象的start方法
- ③運行測試類,查看運行效果
public class Exercise42 {public static void main(String[] args) {new Thread("康師傅"){@Overridepublic void run() {System.out.println(getName() +"愛尚硅谷");}}.start();new Thread(new Runnable() {@Overridepublic void run() {System.out.println("尚硅谷愛我");}}).start();}
}
43、Selector、Touchable接口
案例:
? 1、聲明一個接口:Selector,包含抽象方法:
? (1)boolean hasNext()
? (2)Object next()
? 2、聲明一個接口:Touchable,包含抽象方法:
? (1)Selector select()
? 3、聲明一個MyArrayList類,當(dāng)做容器類使用,模擬動態(tài)數(shù)組數(shù)據(jù)結(jié)構(gòu)的容器
? (1)包含私有屬性:
? ① Object[] all;用于保存對象,初始化長度為2
? ② int total;記錄實際存儲的對象個數(shù)
? (2)包含方法:
? ① public void add(Object element):用于添加一個元素到當(dāng)前容器中,如果數(shù)組all已滿,就擴容為原來的2倍
? ② public void remove(int index):如果index<0或index>=total就打印“沒有這個元素”并返回,否則刪除index位置的元素
? ③ public void set(int index, Object value):如果index<0或index>=total就打印“沒有這個元素”并返回,否則就替換index位置的元素為value
? ④ public Object get(int index):如果index<0或index>=total就打印“沒有這個元素”并返回null,否則返回index位置的元素
? ⑤ 讓類MyArrayList實現(xiàn)Touchable接口,并重寫Selector select()方法,返回內(nèi)部類MySelector的對象
? ⑥ 在類MyArrayList中聲明private的內(nèi)部類MySelector,實現(xiàn)Selector接口
? A:在內(nèi)部類MySelector聲明一個屬性:int cursor(游標(biāo))
? B:MySelector實現(xiàn)Selector接口,并重寫兩個抽象方法,其中
? > boolean hasNext()實現(xiàn)為:return cursor != total
? > Object next()實現(xiàn)為:return all[cursor++]
4、在測試類Exercise43_1中,
(1)創(chuàng)建MyArrayList的對象list
(2)調(diào)用list的add方法,添加3個對象
(3)調(diào)用list的remove方法,刪除[1]的對象
(4)調(diào)用list的set方法,替換[1]的對象
(5)調(diào)用list的get方法,獲取[1]的對象
(6)調(diào)用list的select方法,獲取Selector的對象,并調(diào)用hasNext()和next()遍歷容器中所有的對象
5、在測試類Exercise43_2中,
(1)聲明靜態(tài)的MyArrayList類型的list類變量,
(2)聲明public static void init()方法,
? ①在方法中創(chuàng)建MyArrayList類型對象,
? ②并調(diào)用list的add()方法,添加3個對象,
? ③并在init()方法上標(biāo)記JUnit4的@BeforeClass注解
(3)聲明public void before()方法,
? ①打印“該測試方法開始前l(fā)ist中的數(shù)據(jù)如下:"
? ②調(diào)用list的select方法,獲取Selector的對象,并調(diào)用hasNext()和next()遍歷容器中所有的對象
? ③并在before()方法上標(biāo)記JUnit4的@Before的注解
(4)聲明public void after()方法,
? ①打印“該測試方法結(jié)束后list中的數(shù)據(jù)如下:"
? ②調(diào)用list的select方法,獲取Selector的對象,并調(diào)用hasNext()和next()遍歷容器中所有的對象
? ③并在after()方法上標(biāo)記JUnit4的@After的注解
(5)聲明public void testAdd()方法,
? ①在方法中,打印“現(xiàn)在測試的是testAdd()方法"
? ②在方法中,再次調(diào)用list的add()方法往list容器對象中添加1個對象
? ③并在testAdd()方法上標(biāo)記JUnit4的@Test的注解
(6)聲明public void testRemove()方法,
? ①在方法中,打印“現(xiàn)在測試的是testRemove()方法"
? ②調(diào)用list的remove方法,刪除[1]的對象
? ③并在testRemove()方法上標(biāo)記JUnit4的@Test的注解
(7)聲明public void testSet()方法
? ①在方法中,打印“現(xiàn)在測試的是testSet()方法"
? ②調(diào)用list的set方法,替換[1]的對象
? ③并在testSet()方法上標(biāo)記JUnit4的@Test的注解
(8)聲明public void testGet()方法
? ①在方法中,打印“現(xiàn)在測試的是testGet()方法"
? ②調(diào)用list的get方法,獲取[1]的對象,并打印
? ③并在testGet()方法上標(biāo)記JUnit4的@Test的注解
public interface Selector {boolean hasNext();Object next();
}
public interface Touchable {Selector select();
}
public class MyArrayList implements Touchable{private Object[] all = new Object[2];private int total;public void add(Object element){if(total>=all.length){all = Arrays.copyOf(all, all.length*2);}all[total++] = element;}public void remove(int index){if(index < 0 || index >= total){System.out.println("沒有這個元素");return;}System.arraycopy(all, index+1, all, index, total-index-1);all[--total]=null;}public void set(int index, Object value){if(index < 0 || index >= total){System.out.println("沒有這個元素");return;}all[index] = value;}public Object get(int index){if(index < 0 || index >= total){System.out.println("沒有這個元素");return null;}return all[index];}@Overridepublic Selector select() {return new MySelector();}private class MySelector implements Selector{private int cursor;@Overridepublic boolean hasNext() {return cursor != total;}@Overridepublic Object next() {return all[cursor++];}}
}
public class Exercise43_1 {public static void main(String[] args) {MyArrayList list = new MyArrayList();//---add()---list.add("張三");list.add("李四");list.add("王五");//---remove()---list.remove(1);//---set()---list.set(1,"趙六");//---get()---Object obj = list.get(1);System.out.println("[1] = " + obj);//---select()---Selector select = list.select();while(select.hasNext()){Object next = select.next();System.out.println(next);}}
}
public class Exercise43_2 {private static MyArrayList list;@BeforeClasspublic static void init(){list = new MyArrayList();list.add("張三");list.add("李四");list.add("王五");}@Beforepublic void before(){System.out.println("該測試方法開始前l(fā)ist中的數(shù)據(jù)如下:");Selector select = list.select();while(select.hasNext()){Object next = select.next();System.out.println(next);}}@Afterpublic void after(){System.out.println("該測試方法結(jié)束后list中的數(shù)據(jù)如下:");Selector select = list.select();while(select.hasNext()){Object next = select.next();System.out.println(next);}}@Testpublic void testAdd(){System.out.println("現(xiàn)在測試的是testAdd()方法");list.add("康師傅");}@Testpublic void testRemove(){System.out.println("現(xiàn)在測試的是testRemove()方法");list.remove(1);}@Testpublic void testSet(){System.out.println("現(xiàn)在測試的是testSet()方法");list.set(1,"趙六");}@Testpublic void testGet(){System.out.println("現(xiàn)在測試的是testGet()方法");Object object = list.get(1);System.out.println(object);}}
44、Iterable接口實現(xiàn)類
(1)已知java.lang包有一個Iterable接口(這個接口不用寫),實現(xiàn)該接口類型的對象,就支持foreach循環(huán)遍歷。Iterable接口包含:
- 抽象方法:Iterator iterator();
(2)已知java.util包下有一個Iterator接口(這個接口不用寫),Iterator接口包含抽象方法:
-
boolean hasNext()
-
Object next()
(3)聲明一個動態(tài)數(shù)組類型MyArrayList,當(dāng)做容器類使用,模擬動態(tài)數(shù)組數(shù)據(jù)結(jié)構(gòu)的容器
-
包含私有屬性:
①Object[] all;用于保存對象,初始化長度為10
? ②int total;記錄實際存儲的對象個數(shù)
-
包含方法:
①public void add(Object element):用于添加一個元素到當(dāng)前容器中,如果數(shù)組all已滿,不添加了
②public void remove(int index):如果index<0或index>=total就打印“沒有這個元素”并返回,否則刪除index位置的元素
? ③public void set(int index, Object value):如果index<0或index>=total就打印“沒有這個元素”并返回,否則就替換index位置的元素為value
? ④public Object get(int index):如果index<0或index>=total就打印“沒有這個元素”并返回null,否則返回index位置的元素
? ⑤讓類MyArrayList實現(xiàn)Iterable接口,并重寫Iterator iterator()方法,返回內(nèi)部類Itr的對象
(4)在類MyArrayList內(nèi)部中聲明private的非靜態(tài)內(nèi)部類Itr,實現(xiàn)Iterator接口
- 聲明一個屬性:int cursor(游標(biāo))
- 實現(xiàn)抽象方法boolean hasNext()實現(xiàn)為:return cursor != total;
- 實現(xiàn)抽象方法Object next()實現(xiàn)為:return all[cursor++];
(5)在測試類中,
-
創(chuàng)建MyArrayList的對象list
-
調(diào)用list的add方法,連續(xù)添加5個對象,分別為"atguigu",“java”,“bigdata”,“h5”,“ui”,并用foreach遍歷輸出
-
調(diào)用list的set方法,替換[1]的對象為"javaee",并用foreach遍歷輸出
-
調(diào)用list的remove方法,刪除[1]的對象,并用foreach遍歷輸出
-
調(diào)用list的get方法,獲取[1]的對象
-
調(diào)用list的iterator方法,獲取Iterator接口的實現(xiàn)類對象,結(jié)合while循環(huán)調(diào)用hasNext()和next()遍歷容器中所有的對象
public class MyArrayList implements Iterable {private Object[] all = new Object[10];private int total;public void add(Object element){if(total>=all.length){System.out.println("數(shù)組已滿,無法添加");return;}all[total++] = element;}public void remove(int index){if(index<0 || index>=total){System.out.println("沒有這個元素");return;}for (int i = index; i < total; i++) {all[i] = all[i+1];}all[--total] = null;}public void set(int index, Object value){if(index<0 || index>=total){System.out.println("沒有這個元素");return;}all[index] =value;}public Object get(int index){if(index<0 || index>=total){System.out.println("沒有這個元素");return null;}return all[index];}@Overridepublic Iterator iterator() {return new Itr();}private class Itr implements Iterator{int cursor;@Overridepublic boolean hasNext() {return cursor != total;}@Overridepublic Object next() {return all[cursor++];}}
}
public class Exercise44 {public static void main(String[] args) {MyArrayList list = new MyArrayList();list.add("atguigu");list.add("java");list.add("bigdata");list.add("h5");list.add("ui");System.out.println("添加完5個元素后:");for (Object o : list) {System.out.println(o);}System.out.println("--------------------");list.set(1,"javaee");System.out.println("替換[1]位置的元素為javaee后");for (Object o : list) {System.out.println(o);}System.out.println("--------------------");list.remove(1);System.out.println("刪除[1]位置的元素后");for (Object o : list) {System.out.println(o);}System.out.println("--------------------");Object o = list.get(1);System.out.println("[1]位置的元素現(xiàn)在是" + o);System.out.println("--------------------");Iterator iterator = list.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}}
}
07-枚舉類
45、月份枚舉類
(1)聲明月份枚舉類Month:
①聲明一個屬性,私有化,加final修飾
- description(描述,例如:JANUARY的description為一月,FEBRUARY的description為二月,依次類推)
②聲明一個有參構(gòu)造Month(String description),創(chuàng)建12個常量對象,常量對象的名稱如下
JANUARY,FEBRUARY,MARCH,APRIL,MAY,JUNE,JULY,AUGUST,SEPTEMBER,OCTOBER,NOVEMBER,DECEMBER
③public static Month getByValue(int value):返回對應(yīng)月份值的枚舉對象,例如實參傳入1,則返回JANUARY對象。
④public int length(boolean leapYear):返回這個月的總天數(shù),如果當(dāng)前對象是FEBRUARY,并且leapYear是true,則返回29,否則返回28。其他月份對象無論leapYear參數(shù)是true還是false,都正常返回月份總天數(shù)。
⑤重寫toString():返回對象信息,例如:1->JANUARY->一月份。
2、在測試類中,從鍵盤輸入年份和月份值,獲取對應(yīng)的月份對象,并打印月份對象,并獲取月份總天數(shù)。
public enum Month {JANUARY("一月"),FEBRUARY("二月"),MARCH("三月"),APRIL("四月"),MAY("五月"),JUNE("六月"),JULY("七月"),AUGUST("八月"),SEPTEMBER("九月"),OCTOBER("十月"),NOVEMBER("十一月"),DECEMBER("十二月");private final String description;Month(String description) {this.description = description;}public static Month getByValue(int value){if(value>=1 && value<=12){return Month.values()[value-1];}return null;}public int length(boolean leapYear){switch(this){case FEBRUARY:return leapYear ? 29 : 28;case APRIL:case JUNE:case SEPTEMBER:case NOVEMBER:return 30;default:return 31;}}@Overridepublic String toString() {return (ordinal()+1) +"->" + name() +"->" + description;}
}
public class Exercise45 {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.print("請輸入年份值:");int year = input.nextInt();System.out.print("請輸入月份值:");int monthValue = input.nextInt();Month month = Month.getByValue(monthValue);System.out.println(month);System.out.println("月份總天數(shù):" + month.length(year%4==0 && year%100!=0 || year%400==0));input.close();}
}
46、顏色枚舉類
案例:
1、聲明顏色枚舉類:
- 7個常量對象:赤、橙、黃、綠、青、藍(lán)、紫。
2、在測試類中,使用枚舉類,獲取綠色對象,并打印對象。
public class Exercise46 {public static void main(String[] args) {Color c = Color.GREEN;System.out.println(c);}
}
enum Color{RED,ORANGE,YELLOW,GREEN,CYAN,BLUE,PURPLE
}
47、拓展:顏色枚舉類
(1)聲明顏色枚舉類Color:
- 聲明final修飾的int類型的屬性red,green,blue
- 聲明final修飾的String類型的屬性description
- 聲明有參構(gòu)造Color(int red, int green, int blue,String description)
- 創(chuàng)建7個常量對象:赤、橙、黃、綠、青、藍(lán)、紫,
- 重寫toString方法,例如:RED(255,0,0)->紅色
(2)在測試類中,使用枚舉類,獲取綠色對象,并打印對象。
提示:
- 7個常量對象的RGB值如下:
赤:(255,0,0)
橙:(255,128,0)
黃:(255,255,0)
綠:(0,255,0)
青:(0,255,255)
藍(lán):(0,0,255)
紫:(128,0,255)
- 7個常量對象名如下:
RED, ORANGE, YELLOW, GREEN, CYAN, BLUE,PURPLE
public enum Color {RED(255,0,0,"赤"),ORANGE(255,128,0,"橙"),YELLOW(255,255,0,"黃"),GREEN(0,255,0,"綠"),CYAN(0,255,255,"青"),BLUE(0,0,255,"藍(lán)"),PURPLE(128,0,255,"紫");private final int red;private final int green;private final int blue;private final String description;Color(int red, int green, int blue,String description) {this.red = red;this.green = green;this.blue = blue;this.description = description;}@Overridepublic String toString() {return name()+"("+red+","+green+","+green+")->" + description;}
}
public class Exercise47 {public static void main(String[] args) {Color green = Color.GREEN;System.out.println(green);}
}
48、月份枚舉類
案例:
? 1、聲明月份枚舉類Month:
? (1)創(chuàng)建:1-12月常量對象
? (2)聲明兩個屬性:value(月份值,例如:JANUARY的value為1),
? description(描述,例如:JANUARY的description為1月份是一年的開始)。
? (3)聲明一個有參構(gòu)造,創(chuàng)建12個對象
? (4) 聲明一個方法:public static Month getByValue(int value)
? (5)重寫toString():返回對象信息,例如:1->JANUARY->1月份是一年的開始。
? 2、在測試類中,從鍵盤輸入1個1-12的月份值,獲取對應(yīng)的月份對象,并打印對象
public class Exercise48 {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.print("請輸入月份值(1-12):");int m = input.nextInt();Month month = Month.getByValue(m);System.out.println(month);input.close();}
}
enum Month{JANUARY(1,"1月份是一年的開始"),FEBRUARY(2,"2月份是一年中最短的一個月"),MARCH(3,"3月春暖花開"),APRIL(4,"4月陽光明媚"),MAY(5,"5月清涼初夏"),JUNE(6,"6月驕陽似火"),JULY(7,"7月下半年的第一個月"),AUGUST(8,"8月人已曬干"),SEPTEMBER(9,"秋風(fēng)送爽"),OCTOBER(10,"10月全國同歡"),NOVEMBER(11,"11月尋找秋褲"),DECMEBER(12,"12月冰天雪地");private int value;private String description;private Month(int value,String description){this.value = value;this.description = description;}public static Month getByValue(int value){return Month.values()[value-1];}public String toString(){return value + "->" + name() + "->" + description;}
}
49、支付枚舉類-1
(1)聲明可支付接口Payable:
- 包含抽象方法:void pay();
(2)聲明支付枚舉類Payment:
- 聲明String類型的final屬性description
- 聲明有參構(gòu)造Payment(String description)
- 重寫toString方法,返回description
ALIPAY("支付寶"),WECHAT("微信"),CREDITCARD("信用卡"),DEPOSITCARD("儲蓄卡")
- 枚舉類Payment實現(xiàn)接口Payable
? ①支付寶/微信:對接口的實現(xiàn)是打印“掃碼支付”
? ②信用卡/儲蓄卡:對接口的實現(xiàn)是打印“輸入卡號支付”
(3)在測試類中,獲取所有支付對象,打印支付對象并調(diào)用它們的pay()方法
public interface Payable {void pay();
}
public enum Payment implements Payable{ALIPAY("支付寶"),WECHAT("微信"),CREDITCARD("信用卡"),DEPOSITCARD("儲蓄卡");private final String description;Payment(String description) {this.description = description;}@Overridepublic String toString() {return description;}@Overridepublic void pay() {switch (this){case ALIPAY:case WECHAT:System.out.println("掃碼支付");break;case CREDITCARD:case DEPOSITCARD:System.out.println("輸入卡號支付");break;}}
}
public class Exercise49 {public static void main(String[] args) {Payment[] values = Payment.values();for (int i = 0; i < values.length; i++) {System.out.print(values[i]+":");values[i].pay();}}
}
50、支付枚舉類-2
案例:
1、聲明可支付接口Payable:
? 包含抽象方法:void pay();
2、聲明支付枚舉類Payment:
? (1)創(chuàng)建常量對象:支付寶(ALIPAY),微信(WECHAT),信用卡(CREDIT_CARD),儲蓄卡(DEPOSIT_CARD)
? (2)枚舉類Payment實現(xiàn)接口Payable
? ①支付寶/微信:對接口的實現(xiàn)是打印“掃碼支付”
? ②信用卡/儲蓄卡:對接口的實現(xiàn)是打印“輸入卡號支付”
3、在測試類中,獲取所有支付對象,并調(diào)用它們的pay()
public class Exercise50 {public static void main(String[] args) {Payment[] values = Payment.values();for (int i = 0; i < values.length; i++) {values[i].pay();}}
}
interface Payable{void pay();
}
enum Payment implements Payable{ALIPAY{@Overridepublic void pay() {System.out.println("掃碼支付");}},WECHAT{@Overridepublic void pay() {System.out.println("掃碼支付");}},CREDIT_CARD,DEPOSIT_CARD;@Overridepublic void pay() {System.out.println("輸入卡號支付");}
}
51、設(shè)備狀態(tài)枚舉類
(1)聲明設(shè)備狀態(tài)枚舉類Status
- 聲明final修飾的String類型的屬性description和int類型的屬性value,value值初始化為ordinal()值
- 聲明有參構(gòu)造Status(String description)
- 重寫toString方法,返回description值
- 提供靜態(tài)方法public static Status getByValue(int value):根據(jù)value值獲取Status狀態(tài)對象
- 創(chuàng)建3個常量對象:
FREE("空閑"), USED("在用"), SCRAP("報廢")
(2)聲明設(shè)備類型Equipment
- 聲明設(shè)備編號(int)、設(shè)備的品牌(String)、價格(double)、設(shè)備名稱(String)、狀態(tài)(Status)屬性,私有化
- 提供無參和有參構(gòu)造
- 重寫toString方法,返回設(shè)備信息
(3)現(xiàn)有Data.java,代碼如下:
public class Data {public static final String[][] EQUIPMENTS = {{"1", "聯(lián)想", "6000", "拯救者","0"},{"2", "宏碁 ","5000", "AT7-N52","0"},{"3", "小米", "2000", "5V5Pro","1"},{"4", "戴爾", "4000", "3800-R33","1"},{"5", "蘋果", "12000", "MBP15","1"},{"6", "華碩", "8000", "K30BD-21寸","2"},{"7", "聯(lián)想", "7000", "YOGA","0"},{"8", "惠普", "5800", "X500","2"},{"9", "蘋果", "4500","2021Pro","0"},{"10", "惠普", "5800", "FZ5","1"}};
}
(4)在測試類中,創(chuàng)建Equipment類型的數(shù)組,并使用Data類的二維數(shù)組EQUIPMENTS的信息初始化設(shè)備對象,遍歷輸出
public enum Status {FREE("空閑"), USED("在用"), SCRAP("報廢");private final int value;private final String description;private Status(String description) {this.value = ordinal();this.description = description;}public String getDescription() {return description;}public static Status getByValue(int value){return Status.values()[value];}@Overridepublic String toString() {return description;}
}
public class Equipment {private int id;private String factory;private double price;private String name;private Status status;public Equipment() {}public Equipment(int id, String factory, double price, String name, Status status) {this.id = id;this.factory = factory;this.price = price;this.name = name;this.status = status;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getFactory() {return factory;}public void setFactory(String factory) {this.factory = factory;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public Status getStatus() {return status;}public void setStatus(Status status) {this.status = status;}@Overridepublic String toString() {return "Equipment{" +"id=" + id +", factory='" + factory + '\'' +", name='" + name + '\'' +", price=" + price +", status=" + status +'}';}
}
public class Data {public static final String[][] EQUIPMENTS = {{"1", "聯(lián)想", "6000", "拯救者","0"},{"2", "宏碁 ","5000", "AT7-N52","0"},{"3", "小米", "2000", "5V5Pro","1"},{"4", "戴爾", "4000", "3800-R33","1"},{"5", "蘋果", "12000", "MBP15","1"},{"6", "華碩", "8000", "K30BD-21寸","2"},{"7", "聯(lián)想", "7000", "YOGA","0"},{"8", "惠普", "5800", "X500","2"},{"9", "蘋果", "4500","2021Pro","0"},{"10", "惠普", "5800", "FZ5","1"}};
}
public class Exercise51 {public static void main(String[] args) {Equipment[] arr = new Equipment[EQUIPMENTS.length];for (int i = 0; i < arr.length; i++) {int id = Integer.parseInt(EQUIPMENTS[i][0]);String factory = EQUIPMENTS[i][1];double price = Double.parseDouble(EQUIPMENTS[i][2]);String name = EQUIPMENTS[i][3];int value = Integer.parseInt(EQUIPMENTS[i][4]);Status status = Status.getByValue(value);arr[i] = new Equipment(id,factory,price,name,status);System.out.println(arr[i]);}}
}
08-注解
52、圖形工具類
案例:
? 1、編寫圖形工具類:ShapTools
? (1)聲明方法1:public static void printRectangle(),打印5行5列*組成的矩形圖形
? (2)聲明方法2:public static void printRectangle(int line, int column, String sign),打印line行column列由sign組成的矩形圖形
? (3)給這個類加上文檔注釋:包含@author,@param等
? (4)給方法1標(biāo)記已過時注解
? 2、編寫測試類Exercise52
? 在測試類中調(diào)用上面的兩個方法測試,如果有警告,就在main方法上抑制警告
public class Exercise52 {public static void main(String[] args) {ShapTools.printRectangle();ShapTools.printRectangle(3, 10, "#");}
}
class ShapTools{@Deprecatedpublic static void printRectangle(){for (int i = 0; i < 5; i++) {for (int j = 0; j < 5; j++) {System.out.print("*");}System.out.println();}}public static void printRectangle(int line, int column, String sign){for (int i = 0; i < line; i++) {for (int j = 0; j < column; j++) {System.out.print(sign);}System.out.println();}}
}
09-包裝類
53、代碼閱讀題
public static void main(String[] args) {Integer i1 = 128;Integer i2 = 128;int i3 = 128;int i4 = 128;System.out.println(i1 == i2);System.out.println(i3 == i4);System.out.println(i1 == i3);
}
package com.atguigu.test1;public class Exercise53 {public static void main(String[] args) {Integer i1 = 128;Integer i2 = 128;int i3 = 128;int i4 = 128;System.out.println(i1 == i2);//false,比較地址,128超過Integer緩存對象System.out.println(i3 == i4);//true,比較數(shù)據(jù)值System.out.println(i1 == i3);//true,i1自動拆箱按照基本數(shù)據(jù)類型比較//包裝類對象與基本數(shù)據(jù)類型進(jìn)行比較時,就會把包裝類對象自動拆箱,按照基本數(shù)據(jù)類型的規(guī)則進(jìn)行比較}
}
54、代碼閱讀題
public class Exercise54{public static void main(String[] args) {double a = 2.0;double b = 2.0;Double c = 2.0;Double d = 2.0;System.out.println(a == b);System.out.println(c == d);System.out.println(a == d);}
}
public class Exercise54{public static void main(String[] args) {double a = 2.0;double b = 2.0;Double c = 2.0;Double d = 2.0;System.out.println(a == b);//true,基本數(shù)據(jù)類型比較數(shù)據(jù)值System.out.println(c == d);//false,對象比較地址值,Double沒有緩存對象System.out.println(a == d);//true,d自動拆箱,按照基本數(shù)據(jù)類型比較}
}
55、Employee、Programmer、Designer、Architect等類
(1)現(xiàn)有Data.java文件
public class Data{public static final int EMPLOYEE = 10;//表示普通員工public static final int PROGRAMMER = 11;//表示程序員public static final int DESIGNER = 12;//表示設(shè)計師public static final int ARCHITECT = 13;//表示架構(gòu)師public static final String[][] EMPLOYEES = {{"10", "1", "段譽", "22", "3000"},{"13", "2", "令狐沖", "32", "18000", "15000", "2000"},{"11", "3", "任我行", "23", "7000"},{"11", "4", "張三豐", "24", "7300"},{"12", "5", "周芷若", "28", "10000", "5000"},{"11", "6", "趙敏", "22", "6800"},{"12", "7", "張無忌", "29", "10800","5200"},{"13", "8", "韋小寶", "30", "19800", "15000", "2500"},{"12", "9", "楊過", "26", "9800", "5500"},{"11", "10", "小龍女", "21", "6600"},{"11", "11", "郭靖", "25", "7100"},{"12", "12", "黃蓉", "27", "9600", "4800"}};
}
(2)聲明員工類、程序員類、設(shè)計師類、架構(gòu)師類,關(guān)系如下:
(2-1)普通員工Employee類
- 包含編號、姓名、年齡、工資,屬性私有化
- 提供無參構(gòu)造
- 提供有參構(gòu)造Employee(int id, String name, int age, double salary)
- 提供get/set方法
- 提供String getBasicInfo()方法:返回員工基本信息
- 重寫toString():返回員工基本信息
(2-2)程序員Programmer類,繼承普通員工類
- 提供無參構(gòu)造
- 提供有參構(gòu)造Programmer(int id, String name, int age, double salary)
- 重寫toString(),增加職位“程序員”信息
(2-3)設(shè)計師Designer類,繼承程序員類
- 增加獎金屬性
- 提供無參構(gòu)造
- 提供有參構(gòu)造Designer(int id, String name, int age, double salary, double bonus)
- 重寫toString(),增加職位“設(shè)計師”和獎金信息
(2-4)架構(gòu)師Architect類,繼承設(shè)計師類
- 增加股票屬性
- 提供無參構(gòu)造
- 提供有參構(gòu)造Architect(int id, String name, int age, double salary, double bonus, int stock)
- 重寫toString()方法,增加職位“架構(gòu)師”和獎金、股票信息
(3)在測試類中創(chuàng)建員工數(shù)組,用Data類中的二維數(shù)組數(shù)據(jù)進(jìn)行員工數(shù)組的初始化
提示:把字符串轉(zhuǎn)為int和double類型的值,可以使用如下方式:
String idStr = "1";
int id = Integer.parseInt(idStr);String salaryStr = "7300";
double salary = Double.parseDouble(salaryStr);
(4)遍歷數(shù)組,使用如下格式
public class Employee {private int id;private String name;//姓名private int age;//年齡private double salary;//工資public Employee() {}public Employee(int id, String name, int age, double salary) {this.id = id;this.name = name;this.age = age;this.salary = salary;}public int getId() {return id;}public void setId(int id) {this.id = id;}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 double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}public String getBasicInfo(){return id + "\t\t" + name + "\t" + age + "\t\t" + salary;}public String toString() {return getBasicInfo();}
}
public class Programmer extends Employee {public Programmer() {}public Programmer(int id, String name, int age, double salary) {super(id, name, age, salary);}@Overridepublic String toString() {return super.getBasicInfo() + "\t\t程序員";}
}
public class Designer extends Programmer {private double bonus;// : 獎金public Designer() {}public Designer(int id, String name, int age, double salary, double bonus) {super(id, name, age, salary);this.bonus = bonus;}public double getBonus() {return bonus;}public void setBonus(double bonus) {this.bonus = bonus;}@Overridepublic String toString() {return super.getBasicInfo() + "\t\t設(shè)計師" + "\t" + bonus;}
}
public class Architect extends Designer {private int stock;// : 股票public Architect() {}public Architect(int id, String name, int age, double salary, double bonus, int stock) {super(id, name, age, salary, bonus);this.stock = stock;}public int getStock() {return stock;}public void setStock(int stock) {this.stock = stock;}@Overridepublic String toString() {return super.getBasicInfo() + "\t\t架構(gòu)師" + "\t" + getBonus() + "\t" + stock;}
}
public class Data{public static final int EMPLOYEE = 10;//表示普通員工public static final int PROGRAMMER = 11;//表示程序員public static final int DESIGNER = 12;//表示設(shè)計師public static final int ARCHITECT = 13;//表示架構(gòu)師public static final String[][] EMPLOYEES = {{"10", "1", "段譽", "22", "3000"},{"13", "2", "令狐沖", "32", "18000", "15000", "2000"},{"11", "3", "任我行", "23", "7000"},{"11", "4", "張三豐", "24", "7300"},{"12", "5", "周芷若", "28", "10000", "5000"},{"11", "6", "趙敏", "22", "6800"},{"12", "7", "張無忌", "29", "10800","5200"},{"13", "8", "韋小寶", "30", "19800", "15000", "2500"},{"12", "9", "楊過", "26", "9800", "5500"},{"11", "10", "小龍女", "21", "6600"},{"11", "11", "郭靖", "25", "7100"},{"12", "12", "黃蓉", "27", "9600", "4800"}};
}
import static com.atguigu.wrapper.Data.*;
public class Exercise55 {public static void main(String[] args) {Employee[] arr = new Employee[EMPLOYEES.length];for (int i = 0; i < arr.length; i++) {int type = Integer.parseInt(EMPLOYEES[i][0]);int id = Integer.parseInt(EMPLOYEES[i][1]);String name = EMPLOYEES[i][2];int age = Integer.parseInt(EMPLOYEES[i][3]);double salary = Double.parseDouble(EMPLOYEES[i][4]);switch (type){case EMPLOYEE:arr[i] = new Employee(id,name,age,salary);break;case PROGRAMMER:arr[i] = new Programmer(id,name,age,salary);break;case DESIGNER:double bonus = Double.parseDouble(EMPLOYEES[i][5]);arr[i] = new Designer(id,name,age,salary,bonus);break;case ARCHITECT:bonus = Double.parseDouble(EMPLOYEES[i][5]);int stock = Integer.parseInt(EMPLOYEES[i][6]);arr[i] = new Architect(id,name,age,salary,bonus,stock);break;}System.out.println(arr[i]);}}
}