------- android培訓、java培訓、期待與您交流! ----------
10.01 運動員和教練案例分析
教練和運動員案例:運動員分乒乓球運動員和籃球運動員,教練分乒乓球教練和籃球教練。為了出國交流,跟乒乓球相關的人員都需要學習英語。
分析:
10.02 運動員和教練案例實現
1 //定義一個說英語的接口 2 interface SpeakEnglish 3 { 4 //說英語 5 public abstract void speak(); 6 } 7 8 //定義人的抽象類 9 abstract class Person 10 { 11 PRivate String name; 12 private int age; 13 14 public Person() {} 15 16 public Person(String name,int age) 17 { 18 this.name = name; 19 this.age = age; 20 } 21 22 public String getName() 23 { 24 return name; 25 } 26 27 public void setName(String name) 28 { 29 this.name = name; 30 } 31 32 public int getAge() 33 { 34 return age; 35 } 36 37 public void setAge(int age) 38 { 39 this.age = age; 40 } 41 42 //睡覺 43 public void sleep() 44 { 45 System.out.println("人都是要睡覺的"); 46 } 47 48 //吃飯 49 public abstract void eat(); 50 } 51 52 //定義運動員抽象類 53 abstract class Player extends Person 54 { 55 public Player() {} 56 57 public Player(String name,int age) 58 { 59 super(name,age); 60 } 61 62 //學習 63 public abstract void study(); 64 } 65 66 //定義教練抽象類 67 abstract class Coach extends Person 68 { 69 public Coach() {} 70 71 public Coach(String name,int age) 72 { 73 super(name,age); 74 } 75 76 //教學 77 public abstract void teach(); 78 } 79 80 //定義乒乓球運動員具體類 81 class PingPangPlayer extends Player implements SpeakEnglish 82 { 83 public PingPangPlayer(){} 84 85 public PingPangPlayer(String name,int age) 86 { 87 super(name,age); 88 } 89 90 //吃 91 public void eat() 92 { 93 System.out.println("乒乓球運動員吃大白菜,喝小米粥"); 94 } 95 96 //學習 97 public void study() 98 { 99 System.out.println("乒乓球運動員學習如何發球和接球");100 }101 102 //說英語103 public void speak() 104 {105 System.out.println("乒乓球運動員說英語");106 }107 }108 109 //定義籃球運動員具體類110 class BasketballPlayer extends Player 111 {112 public BasketballPlayer(){}113 114 public BasketballPlayer(String name,int age) 115 {116 super(name,age);117 }118 119 //吃120 public void eat() 121 {122 System.out.println("籃球運動員吃牛肉,喝牛奶");123 }124 125 //學習126 public void study() 127 {128 System.out.println("籃球運動員學習如何運球和投籃");129 }130 }131 132 //定義乒乓球教練具體類133 class PingPangCoach extends Coach implements SpeakEnglish 134 {135 public PingPangCoach(){}136 137 public PingPangCoach(String name,int age) 138 {139 super(name,age);140 }141 142 //吃143 public void eat() 144 {145 System.out.println("乒乓球教練吃小白菜,喝大米粥");146 }147 148 //教149 public void teach() 150 {151 System.out.println("乒乓球教練教如何發球和接球");152 }153 154 //說英語155 public void speak() 156 {157 System.out.println("乒乓球教練說英語");158 }159 }160 161 //定義籃球教練具體類162 class BasketballCoach extends Coach 163 {164 public BasketballCoach(){}165 166 public BasketballCoach(String name,int age) 167 {168 super(name,age);169 }170 171 //吃172 public void eat() 173 {174 System.out.println("籃球教練吃羊肉,喝羊奶");175 }176 177 //教178 public void teach() 179 {180 System.out.println("籃球教練教如何運球和投籃");181 }182 }10.03 運動員和教練案例測試
1 //定義一個說英語的接口 2 interface SpeakEnglish 3 { 4 //說英語 5 public abstract void speak(); 6 } 7 8 //定義人的抽象類 9 abstract class Person 10 { 11 private String name; 12 private int age; 13 14 public Person() {} 15 16 public Person(String name,int age) 17 { 18 this.name = name; 19 this.age = age; 20 } 21 22 public String getName() 23 { 24 return name; 25 } 26 27 public void setName(String name) 28 { 29 this.name = name; 30 } 31 32 public int getAge() 33 { 34 return age; 35 } 36 37 public void setAge(int age) 38 { 39 this.age = age; 40 } 41 42 //睡覺 43 public void sleep() 44 { 45 System.out.println("人都是要睡覺的"); 46 } 47 48 //吃飯 49 public abstract void eat(); 50 } 51 52 //定義運動員抽象類 53 abstract class Player extends Person 54 { 55 public Player() {} 56 57 public Player(String name,int age) 58 { 59 super(name,age); 60 } 61 62 //學習 63 public abstract void study(); 64 } 65 66 //定義教練抽象類 67 abstract class Coach extends Person 68 { 69 public Coach() {} 70 71 public Coach(String name,int age) 72 { 73 super(name,age); 74 } 75 76 //教學 77 public abstract void teach(); 78 } 79 80 //定義乒乓球運動員具體類 81 class PingPangPlayer extends Player implements SpeakEnglish 82 { 83 public PingPangPlayer(){} 84 85 public PingPangPlayer(String name,int age) 86 { 87 super(name,age); 88 } 89 90 //吃 91 public void eat() 92 { 93 System.out.println("乒乓球運動員吃大白菜,喝小米粥"); 94 } 95 96 //學習 97 public void study() 98 { 99 System.out.println("乒乓球運動員學習如何發球和接球");100 }101 102 //說英語103 public void speak() 104 {105 System.out.println("乒乓球運動員說英語");106 }107 }108 109 //定義籃球運動員具體類110 class BasketballPlayer extends Player 111 {112 public BasketballPlayer(){}113 114 public BasketballPlayer(String name,int age) 115 {116 super(name,age);117 }118 119 //吃120 public void eat() 121 {122 System.out.println("籃球運動員吃牛肉,喝牛奶");123 }124 125 //學習126 public void study() 127 {128 System.out.println("籃球運動員學習如何運球和投籃");129 }130 }131 132 //定義乒乓球教練具體類133 class PingPangCoach extends Coach implements SpeakEnglish 134 {135 public PingPangCoach(){}136 137 public PingPangCoach(String name,int age) 138 {139 super(name,age);140 }141 142 //吃143 public void eat() 144 {145 System.out.println("乒乓球教練吃小白菜,喝大米粥");146 }147 148 //教149 public void teach() 150 {151 System.out.println("乒乓球教練教如何發球和接球");152 }153 154 //說英語155 public void speak() 156 {157 System.out.println("乒乓球教練說英語");158 }159 }160 161 //定義籃球教練具體類162 class BasketballCoach extends Coach 163 {164 public BasketballCoach(){}165 166 public BasketballCoach(String name,int age) 167 {168 super(name,age);169 }170 171 //吃172 public void eat() 173 {174 System.out.println("籃球教練吃羊肉,喝羊奶");175 }176 177 //教178 public void teach() 179 {180 System.out.println("籃球教練教如何運球和投籃");181 }182 }183 class Demo184 {185 public static void main(String[] args)186 {187 //測試運動員(乒乓球運動員和籃球運動員)188 //乒乓球運動員189 PingPangPlayer ppp = new PingPangPlayer();190 ppp.setName("王浩");191 ppp.setAge(33);192 System.out.println(ppp.getName()+"---"+ppp.getAge());193 ppp.eat();194 ppp.sleep();195 ppp.study();196 ppp.speak();197 System.out.println("----------------");198 199 //籃球運動員200 BasketballPlayer bp = new BasketballPlayer();201 bp.setName("姚明");202 bp.setAge(34);203 System.out.println(bp.getName()+"---"+bp.getAge());204 bp.eat();205 bp.sleep();206 bp.study();207 //bp.speak(); //沒有該方法208 }209 }運行結果:
王浩---33乒乓球運動員吃大白菜,喝小米粥人都是要睡覺的乒乓球運動員學習如何發球和接球乒乓球運動員說英語----------------姚明---34籃球運動員吃牛肉,喝牛奶人都是要睡覺的籃球運動員學習如何運球和投籃
10.04 類名作為形式參數
形式參數和返回值問題
形式參數:基本類型、引用類型(類、抽象類、接口)
返回值類型:基本類型、引用類型(類、抽象類、接口)
例:
1 class Student 2 { 3 public void study() 4 { 5 System.out.println("好好學習"); 6 } 7 } 8 class StudentTest 9 {10 //形式參數是一個類11 public void method(Student s)12 {13 s.study();14 }15 }16 class Demo17 {18 public static void main(String[] args)19 {20 StudentTest st = new StudentTest();21 Student s = new Student();22 //需要的是該類的對象23 st.method(s);24 }25 }運行結果:
好好學習
10.05 抽象類名作為形式參數
例:
1 abstract class Person 2 { 3 public abstract void study(); 4 } 5 6 class Student extends Person 7 { 8 public void study() 9 {10 System.out.println("好好學習");11 }12 }13 class PersonTest14 {15 //形式參數是一個抽象類16 public void method(Person p)17 {18 p.study();19 }20 }21 class Demo22 {23 public static void main(String[] args)24 {25 PersonTest pt = new PersonTest();26 Person p = new Student();27 //需要該抽象類的子類對象28 pt.method(p);29 }30 }運行結果:
好好學習
10.06 接口名作為形式參數
例:
1 interface Love 2 { 3 public abstract void love(); 4 } 5 class Teacher implements Love 6 { 7 public void love() 8 { 9 System.out.println("老師愛學生");10 }11 }12 class LoveTest13 {14 //形式參數是一個接口15 public void method(Love l)16 {17 l.love();18 }19 }20 class Demo21 {22 public static void main(String[] args)23 {24 LoveTest lt = new LoveTest();25 Love l = new Teacher();26 //需要該接口的實現類對象27 lt.method(l);28 }29 }運行結果:
老師愛學生
10.07 類名作為返回值類型
例:
1 class Student 2 { 3 public void study() 4 { 5 System.out.println("好好學習"); 6 } 7 } 8 class StudentTest 9 {10 //返回值是一個類11 public Student getStudent()12 {13 //真實返回的是該類的對象14 return new Student();15 }16 }17 class Demo18 {19 public static void main(String[] args)20 {21 StudentTest st = new StudentTest();22 Student s = st.getStudent();23 s.study();24 }25 }10.08 抽象類名作為返回值類型
例:
1 abstract class Person 2 { 3 public abstract void study(); 4 } 5 class Student extends Person 6 { 7 public void study() 8 { 9 System.out.println("好好學習");10 }11 }12 class PersonTest13 {14 //返回值是一個抽象類15 public Person getPerson()16 {17 //真實返回的是抽象類的子類對象18 return new Student();19 }20 }21 class Demo22 {23 public static void main(String[] args)24 {25 PersonTest pt = new PersonTest();26 Person p = pt.getPerson();27 p.study();28 }29 }10.09 接口名作為返回值類型
例:
1 interface Love 2 { 3 public abstract void love(); 4 } 5 class Teacher implements Love 6 { 7 public void love() 8 { 9 System.out.println("老師愛學生");10 }11 }12 class LoveTest13 {14 //返回值是一個接口15 public Love getLove()16 {17 //真實返回的是該接口的實現類對象18 return new Teacher();19 }20 }21 class Demo22 {23 public static void main(String[] args)24 {25 LoveTest lt = new LoveTest();26 Love l = lt.getLove();27 l.love();28 }29 }10.10 鏈式編程
例:
1 class Student 2 { 3 public void study() 4 { 5 System.out.println("好好學習"); 6 } 7 } 8 class StudentTest 9 {10 public Student getStudent()11 {12 return new Student();13 }14 }15 class Demo16 {17 public static void main(String[] args)18 {19 //鏈式編程,每次調用方法完畢后返回的是一個對象20 new StudentTest().getStudent().study();21 }22 }10.11 package關鍵字的概述及作用
包的概述:其實就是文件夾
作用:對類進行分類管理
包的劃分:
例:學生的增加,刪除,修改,查詢和老師的增加,刪除,修改,查詢
基本的劃分:
按照功能分
cn.itcast.add(AddStudent,AddTeacher)
cn.itcast.delete(DeleteStudent,DeleteTeacher)
cn.itcast.update(UpdateStudent,UpdateTeacher)
cn.itcast.find(FindStudent,FindTeacher)
按照模塊分
cn.itcast.teacher(AddTeacher,DeleteTeacher,UpdateTeacher,FindTeacher)
cn.itcast.student(AddStudent,DeleteStudent,UpdateStudent,FindStudent)
10.12 包的定義及注意事項
定義包的格式:package 包名; 多級包用.分開即可
注意事項:
1.package語句必須是程序的第一條可執行的代碼
2.package語句在一個java文件中只能有一個
3.如果沒有package,默認表示無包名
10.13 帶包的類編譯和運行
手動式
1:javac編譯當前類文件
2:手動建立包對應的文件夾
3:把1步驟的class文件放到2步驟的最終文件夾下
4:通過java命令執行。
注意:需要帶包名稱執行
例:
1 package cn.itcast;2 class Demo3 {4 public static void main(String[] args)5 {6 System.out.println("hello world");7 }8 }運行:

自動式
1:javac編譯的時候帶上-d即可
例:javac -d . HelloWorld.java (-d后面跟的是目錄, .表示當前目錄)
2:通過java命令執行。需要帶包名稱執行。
10.14 不同包下類之間的訪問
例:
定義兩個類:Demo,Test。
Demo:測試方法(main)
Test:求和方法(sum)

運行步驟如下:

10.15 import關鍵字的概述和使用
導包概述:不同包下的類之間的訪問,每次使用不同包下的類的時候,都需要加包的全路徑。比較麻煩。這個時候,java就提供了導包的功能。
導包格式:import 包名;
注意:這種方式導入是到類的名稱。雖然可以最后寫*,但是不建議。使用哪個類就導入哪個類。
例:
面試題:package,import,class有沒有順序關系?
有,package>import>class
package:只能有一個
import:可以有多個
class:可以有多個,建議只寫一個
10.16 四種權限修飾符

10.17 類及其組成所使用的常見修飾符
權限修飾符:public、protected、默認的、private
狀態修飾符:static、final
抽象修飾符:abstract
1.類:默認,public、final、abstract。其中使用public居多
2.成員變量:四種權限修飾符均可,final、static。其中使用private居多
3.構造方法:四種權限修飾符均可,其他不可以。其中使用public居多
4.成員方法:四種權限修飾符均可,fianl、static、abstract。其中使用public居多
10.18 內部類概述和訪問特點
把類定義在其他類的內部,這個類就被稱為內部類。
例:在類A中定義了一個類B,類B就是內部類。
內部類的訪問特點:
內部類可以直接訪問外部類的成員,包括私有。
外部類要訪問內部類的成員,必須創建對象。
例:
1 class Outer 2 { 3 private int num = 10; 4 //內部類 5 class Inner 6 { 7 public void show() 8 { 9 //內部類可以直接訪問外部類的成員,包括私有10 System.out.println("show run..."+num);11 }12 }13 public void method()14 {15 //外部類要訪問內部類的方法必須創建內部類的對象16 Inner in = new Inner();17 in.show();18 }19 }
10.19 內部類分類及成員內部類的使用
按照內部類在類中定義的位置不同,可以分為如下兩種格式:
在成員位置稱為成員內部類
在局部位置稱為局部內部類
例:
1 class Outer 2 { 3 //成員內部類 4 class Inner 5 { 6 } 7 public void method() 8 { 9 //局部內部類10 class Inner11 {12 }13 }14 }外界創建成員內部類對象的格式:
外部類名.內部類名對象名 = 外部類對象.內部類對象;
例:
1 class Outer 2 { 3 private int num = 10; 4 //成員內部類 5 class Inner 6 { 7 public void show() 8 { 9 System.out.println(num);10 }11 }12 }13 class Demo14 {15 public static void main(String[] args)16 {17 //訪問Inner類的show()方法18 //外部類名.內部類名 對象名 = 外部類對象.內部類對象;19 Outer.Inner oi = new Outer().new Inner();20 oi.show();21 }22 }10.20 成員內部類的常見修飾符及應用
成員內部類的常見修飾符
1.private 為了保證數據的安全性
例:
1 class Outer 2 { 3 //成員內部類,私有 4 private class Inner 5 { 6 public void show() 7 { 8 System.out.println("滿足條件輸出"); 9 }10 }11 public void method(int num)12 {13 if(num > 0)14 {15 Inner i = new Inner();16 i.show();17 }18 }19 }20 class Demo21 {22 public static void main(String[] args)23 {24 Outer o = new Outer();25 o.method(-8);26 }27 }上例中,只有當method方法傳入的參數大于0時,才可以創建內部類的對象調用方法,否則不創建
2.static 為了讓數據訪問更方便
例:
1 class Outer 2 { 3 private static int num = 10; 4 //成員內部類,靜態 5 public static class Inner 6 { 7 //靜態方法 8 public static void show1() 9 {10 System.out.println(num);11 }12 //非靜態方法13 public void show2()14 {15 System.out.println(num);16 }17 }18 }19 class Demo20 {21 public static void main(String[] args)22 {23 //成員內部類被靜態修飾后的訪問方式:24 //外部類名.內部類名 對象名 = new 外部類名.內部類名();25 Outer.Inner oi = new Outer.Inner();26 oi.show1();27 oi.show2();28 29 //靜態方法show1()的另一種調用方式30 Outer.Inner.show1();31 }32 }10.21 成員內部類的面試題
分別輸出30、20、10
1 class Outer 2 { 3 public int num = 10; 4 class Inner 5 { 6 public int num = 20; 7 public void show() 8 { 9 int num = 30;10 System.out.println(num);//3011 System.out.println(this.num);//2012 System.out.println(new Outer().num);//1013 System.out.println(Outer.this.num);//1014 }15 }16 }17 class Demo18 {19 public static void main(String[] args)20 {21 Outer.Inner oi = new Outer().new Inner();22 oi.show();23 }24 }10.22 局部內部類訪問局部變量的問題
1.可以直接訪問外部類的成員
2.在局部位置可以創建內部類對象,通過對象調用內部類方法,來使用局部內部類功能
例:
1 class Outer 2 { 3 private int num = 10; 4 public void method() 5 { 6 //局部內部類 7 class Inner 8 { 9 public void show()10 {11 //可以直接訪問外部類的成員12 System.out.println(num);13 }14 }15 //在局部位置創建內部類對象16 Inner i = new Inner();17 //通過對象調用內部類方法18 i.show();19 }20 }21 class Demo22 {23 public static void main(String[] args)24 {25 Outer o = new Outer();26 o.method();27 }28 }局部內部類訪問局部變量的注意事項:
例:
1 class Outer 2 { 3 public void method() 4 { 5 //局部變量 6 final int num = 20; 7 //局部內部類 8 class Inner 9 {10 public void show()11 {12 //局部內部類訪問局部變量,該局部變量必須被聲明為最終類型13 System.out.println(num);14 }15 }16 17 Inner i = new Inner();18 i.show();19 }20 }21 class Demo22 {23 public static void main(String[] args)24 {25 Outer o = new Outer();26 o.method();27 }28 }因為局部變量會隨著方法的調用完畢而消失,這個時候,局部對象并沒有立馬從堆內存中消失,還要使用那個變量。為了讓數據還能繼續被使用,就用fianl修飾,這樣,在堆內存里面存儲的其實是一個常量值。
10.23 匿名內部類的格式和理解
匿名內部類就是內部類的簡化寫法。
前提:存在一個類或者接口,這里的類可以是具體類也可以是抽象類。
格式:new 類名或者接口名() {重寫方法;}
本質:是一個繼承了該類或者實現了該接口的子類匿名對象
例:

10.24 匿名內部類的方法調用
例:
1 interface Inter 2 { 3 public abstract void show1(); 4 public abstract void show2(); 5 } 6 class Outer 7 { 8 public void method() 9 {10 /* 一個方法的調用11 new Inter()12 {13 public void show1()14 {15 System.out.println("show1");16 }17 }.show1();18 */19 //兩個方法的調用20 Inter i = new Inter()21 {22 public void show1()23 {24 System.out.println("show1");25 }26 public void show2()27 {28 System.out.println("show2");29 }30 };31 i.show1();32 i.show2();33 }34 }35 class Demo36 {37 public static void main(String[] args)38 {39 Outer o = new Outer();40 o.method();41 }42 }10.25 匿名內部類在開發中的應用
例:
1 interface Person 2 { 3 public abstract void study(); 4 } 5 class PersonDemo 6 { 7 public void method(Person p) 8 { 9 p.study();10 }11 }12 class Demo13 {14 public static void main(String[] args)15 {16 PersonDemo pd = new PersonDemo();17 pd.method(new Person()18 {19 public void study()20 {21 System.out.println("好好學習");22 }23 });24 }25 }當函數參數是接口類型時,而且接口中的方法不超過三個,可以用匿名內部類作為實際參數進行傳遞
10.26 匿名內部類的面試題
按照要求,補齊代碼,要求在控制臺輸出”HelloWorld”
1 interface Inter 2 { 3 void show(); 4 } 5 class Outer 6 { 7 //補齊代碼 8 } 9 class Demo10 {11 public static void main(String[] args)12 {13 Outer.method().show();14 }15 }補齊代碼:
1 /* 2 分析: 3 1:Outer.method()可以看出method()是Outer中的一個靜態方法 4 2:Outer.method().show()可以看出method()方法的返回值是一個對象。 5 又由于接口Inter中有一個show()方法,所以method()方法的返回值類型是一個接口。 6 */ 7 interface Inter 8 { 9 void show(); 10 }11 class Outer 12 { 13 //補齊代碼 14 public static Inter method()15 {16 return new Inter()17 {18 public void show()19 {20 System.out.println("helloworld");21 }22 };23 }24 }25 class Demo26 {27 public static void main(String[] args)28 {29 Outer.method().show();30 }31 }新聞熱點
疑難解答