java--面向对象(4)--黑马程序员
------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------
面向對象(4)
主要內容:《?抽象類、 接口、類名作為形式參數、抽象類名作為形式參數、接口名作為形式參數、類名作為返回值類型、 抽象類名作為返回值類型、接口名作為返回值類型、鏈式編程?》
1 抽象類的概述及其特點
回顧我們之前的繼承:
1.一般不會實例化"父類"的對象;因為"父類"沒有對應現實世界中的實體。我們經常使用子類。
2.父類會定義某些方法,而這個方法會被每個子類重寫。
1 class Person{ 2 void show(){ 3 System.out.println("我是傳智播客的一員"); 4 } 5 } 6 class Student extends Person{ 7 //重寫 8 void show(){ 9 System.out.println("我是傳智播客的一名學生,我驕傲!!"); 10 } 11 class Teacher extends Person{ 12 //重寫 13 void show(){ 14 System.out.println(我是傳智播客的一名教師,我驕傲!!"); 15 }3.基于上述,以及一些其它原因:
1).某些父類既然不會去實例化,那么就干脆將這個類定義為:不可實例化的;這種類就叫:抽象類2).父類中的某些方法,都會被子類重寫,那么干脆:父類只提供"方法簽名",不提供"具體實現"。
??????????????????????????? ? 這種方法就叫:抽象方法;
4.定義抽向,使用關鍵字:abstract
5.可以修飾:1.類:abstract class 類名{}
????????????????????????????????????????? ? 說明:此類將不能被實
例化;就是用來做父類的,讓子類去繼承的;
??????????????????????????? 2.成員方法:abstarct void show();
????????????????????????????????????????? ?說明:此方法是個"抽象方法",用來被子類"重寫的"
6.說明: 1.一個"抽象類"中可以沒有抽象方法;
????????????? 2.如果一個類中包含了"抽象方法",那么這個類必須是"抽象類";
????????????? 3.如果一個"子類"繼承"抽象類",仍然使用關鍵字:extends。而且仍然是"單繼承";
????????????? 4.如果一個"子類"繼承了"抽象類",那么必須重寫全部的"抽象方法"。如果不重寫,或不完全重寫,
????????????? 那么這個"子類"也必須是個"抽象類"。
????????????? 從另一個角度:一個抽象類,可以繼承自另一個抽象類;
1 bstract class Person{ 2 abstract void show(); 3 } 4 class Student extends Person{ 5 //重寫了父類的方法; 6 void show(){ 7 } 8 } 9 class Demo { 10 public static void main(String[] args) { 11 System.out.println("Hello World!"); 12 } 13 }2 ?抽象類的說明
抽象類:
????????????? 1.抽象類中可以沒有抽象方法;也可以什么都沒有;
????????????? 2.如果抽象類中包含了抽象方法,那么這個類必須要聲明為抽象的;
????????????? 3.抽象類中可以有什么:
??????????????????????????? 1).成員變量;
??????????????????????????? 2).構造方法,并且可以重載;為成員變量賦值;
??????????????????????????? 3).普通,實現的成員方法:
??????????????????????????? 4).抽象方法;
????????????? 4.抽象類,跟普通的父類的區別:
??????????????????????????? 1).抽象類不能被實例化;
??????????????????????????? 2).抽象類中可以包含抽象方法;
1 abstract class Person{ 2 //成員變量 3 String name; 4 int age; 5 char sex; 6 //構造方法 7 Person(){ 8 System.out.println("Person的無參構造方法......"); 9 } 10 Person(String name,int age ,char sex){ 11 this.name = name; 12 this.age = age; 13 this.sex = sex; 14 } 15 //普通,實現的成員方法 16 void eat(){ 17 System.out.println("吃飯"); 18 } 19 void sleep(){ 20 System.out.println("睡覺"); 21 } 22 //抽象方法 23 abstract void show(); 24 } 25 class Student extends Person{ 26 Student(){ 27 System.out.println("Student的無參構造方法"); 28 } 29 Student(String name,int age,char sex){ 30 /* 31 this.name = name; 32 this.age = age; 33 this.sex = sex; 34 */ 35 //顯示的調用父類的帶參的構造方法 36 super(name,age,sex); 37 } 38 //重寫show 39 void show(){ 40 System.out.println("子類重寫的show"); 41 } 42 } 43 class Demo { 44 public static void main(String[] args) 45 { 46 Student stu = new Student("張學友",22,'男'); 47 /* 48 stu.name = "劉德華"; 49 stu.age = 20; 50 stu.sex = '男'; 51 */ 52 System.out.println(stu.name + "," + stu.age + "," + stu.sex); 53 } 54 }3 抽象類中的面試題
一.一個類如果沒有抽象方法,可不可以定義為抽象類?如果可以,有什么意義?
1.可以;
2.只是父類使用。而且這個父類不可以實例化;
二.abstract不能和哪些關鍵字共存:
1.private:因為一個抽象方法就是被子類重寫的。要重寫就必須不能為private的。
2.final:因為一個抽象方法就是被子類重寫的。而final表示:最終方法,不能被重寫。所以這兩個關鍵字沖突;
??????????????????????????? ??????? 作用在"類"上也是一樣:一個抽象類就是用來被繼承的。而final類:表示最終類,不能被繼承。所以也是沖突;
3.static:因為一個抽象方法沒有方法體。所以不能定義為static的。因為無法被分配空間;
abstract class Person{
????????????? //一個抽象類內部,可以什么都不定義
????????????? abstract static void show();
}
4 接口的概述及其特點
?
我們之前定義了兩種父類:
1.普通的父類:可以被實例化(雖然我們很少去實例化父類對象);
2.抽象類:它內部包含了一些抽象方法。不能被實例化;
3.接口:???????? 如果一個抽象類中,沒有成員變量,沒有實現的方法,只包含了一些"抽象方法",這時,我們可以將
這個類定義為"接口":
1.定義接口,使用關鍵字:interface
2.接口:不能被實例化,用來被子類"實現"的;
3.子類實現接口,使用關鍵字:implements
4.接口中可以包含(JDK8以前):
????????????? 1).成員變量:必須被聲明為:public static final。如果不寫這幾個修飾符,系統會自動添加.
????????????? 2).抽象方法:必須被聲明為:public abstract。如果不寫這幾個修飾符,系統會自動添加。
5.接口的作用:
1).Java是"單繼承"的,不能同時繼承多個類。Java的一個類實現接口時,可以同時實現多個接口;所以,在Java中,通過"實現接口"達到"功能擴展的目的
1 interface Person{ 2 int num = 10;//編譯為:public static final int num = 10; 3 void show();//編譯為:public abstract void show(); 4 // void fun(){};//編譯錯誤,不能包含實現的方法; 5 } 6 class Student implements Person{ 7 //重寫接口中的抽象方法時,必須要使用:public訪問修飾符; 8 public void show(){ 9 System.out.println("Student的重寫的show()"); 10 } 11 } 12 class Demo { 13 public static void main(String[] args) { 14 Person p = new Student(); 15 p.show(); 16 } 17 }5 接口的作用
Java中通過接口實現功能的擴展:
????????????? 項目經理:
????????????? abstract class Service{
????????????? abstract void save();//新增
????????????? abstract void update();//修改
????????????? abstract void delete();//刪除
????????????? abstract void findById();//用ID查詢一條記錄;
??????????????????????????? }
1 要求,所有項目組的訪問數據庫的類都必須繼承這個類: 2 "用戶管理模塊": 3 class UserService extends Service implements IFu { 4 //重寫方法 5 void save(){ } 6 void update(){ } 7 void delete(){ } 8 void findById(){ } 9 //重寫接口中的方法 10 public void check(){ 11 } 12 public void log(){ 13 } 14 } 15 "車輛管理模塊": 16 class CarService extedns Service implements IFu{ 17 //重寫方法 18 void save(){ 19 } 20 void update(){ 21 } 22 void delete(){ 23 } 24 void findById(){ 25 } 26 //重寫接口中的方法 27 public void check(){ 28 } 29 public void log(){ 30 } 31 } 32 副項目經理: 33 abstract class AbstractFu{ 34 abstract void check();//檢查權限 35 abstract void log();//寫入日志 36 } 37 副項目經理也要求所有模塊的訪問數據庫的類要繼承這個類,并實現這兩個方法; 38 //改為接口實現 39 inteface IFu{ 40 abstract void check();//檢查權限 41 abstract void log();//寫入日志 42 } 43 class Demo { 44 public static void main(String[] args) 45 { 46 System.out.println("Hello World!"); 47 } 48 }6 接口的使用
asd接口的使用:
1.接口的作用就是用來:擴展功能;
2.一個子類,可以同時實現一個,或多個接口;
3.一個子類,可以同時繼承自一個類,并且實現一個,或多個接口。???? 一定要:先繼承,后實現接口;
4.一個子類,如果實現一個接口,那么必須全部重寫接口中的"抽象方法",否則,這個子類,也得是一個抽象的。
5.一個接口可以"繼承自"另一個或多個接口,也就意味著使用關鍵字:extends,并且可以多繼承
類與類,類與接口,接口與接口的關系
類和類,類和接口,接口和接口之間的關系:
1.類和類:繼承:使用關鍵字:extends ;單繼承;
2.類和接口:實現;使用關鍵字:implements;可以同時實現多個接口
3.接口和接口:繼承:使用關鍵字:extends;可以多繼承;
????????????? 上述中說的類都包含"抽象類"
1 //*******類和類**********// 2 class Fu{ 3 } 4 class Zi extends Fu{ 5 } 6 //*********類和接口**************// 7 interface IA{ 8 } 9 class A implements IA{ 10 } 11 //*********接口和接口**********// 12 interface IB{ 13 } 14 interface IC extends IA,IB{ 15 } 16 class Demo { 17 public static void main(String[] args) { 18 System.out.println("Hello World!"); 19 } 20 }7 抽象類和接口的區別
???????? 相同點:
???????? 1.都不能被實例化。都是做父類的;
???????? 區別:
???????? 1.成員:
?????????????????? 抽象類:成員變量、常量、構造方法、實現的方法、抽象方法;
?????????????????? 接口:常量、抽象方法;
???????? 2.關系:
?????????????????? 抽象類:子類是繼承,使用關鍵字:extends
?????????????????? 接口:子類是實現,使用關鍵字:implements
?????????????????? 類和類:是繼承,使用extends;
? ? ? ? ? ? ? ? ? ?接口和接口:是繼承,使用extends;??????????????????
?類和接口:是實現,使用implements;
???????? 3.設計理念:
?????????????????? 抽象類:被設計為"is a(是一個)"的關系。
?????????????????? 接口:被設計為"like a"的關系。
8 類名作為形式參數
1 class Student{ 2 String name; 3 int age; 4 } 5 class BasicStudent extends Student{} 6 class Demo { 7 public static void main(String[] args) { 8 //method(Student);//錯誤,傳遞的不是Student引用 9 //method(Student stu);//錯誤 10 Student s = new Student(); 11 s.name = "劉德華"; 12 s.age = 20; 13 //method(Student s);//錯誤:傳遞實參時,不需要"類型" 14 //1.可以傳遞一個Student對象的引用 15 method(s);//OK的。正確的; 16 //2.可以傳遞一個null值 17 method(null); 18 //3.可以傳遞一個Studend的子類對象的引用。多態 19 BasicStudent s2 = new BasicStudent(); 20 method(s2); 21 //使用匿名對象 22 method(new BasicStudent()); 23 } 24 //當一個"類名"做為形參時,表示:這個方法可以接收一個這個類型的"對象的引用"; 25 //可以傳遞的:1.Student對象的引用(正常情況);2.可以傳遞一個null值;3.Student的子類對象引用(多態) 26 public static void method(Student stu){//Student stu = null; 27 if(stu != null){ 28 System.out.println(stu.name + "," + stu.age); 29 }}}?9 抽象類名作為形式參數
1 abstract class Person{ 2 String name; 3 int age; 4 } 5 class Student extends Person{ 6 } 7 class Demo { 8 public static void main(String[] args) { 9 // Person per = new Person();//不可以。Person是抽象的,不能實例化 10 Student stu = new Student();//實例化一個Person的子類; 11 stu.name = "章子怡"; 12 stu.age = 18; 13 method(stu);//將子類對象的引用作為實參,傳遞進去; 14 } 15 //使用"抽象類"作為方法的形參:意味著,可以接收一個它的"子類對象的引用"(多態); 16 public static void method(Person p){//Person p = new Student(); 17 System.out.println(p.name + "," + p.age); 18 } 19 }10 接口名作為形式參數
1 interface English{ 2 void speakEnglish(); 3 } 4 class Student implements English{ 5 //重寫方法 6 public void speakEnglish(){ 7 System.out.println("我是學生,我說英語......"); 8 } 9 } 10 class Player implements English{ 11 //重寫方法 12 public void speakEnglish(){ 13 System.out.println("我是運動員,我說英語......"); 14 } 15 } 16 class Coach{ 17 public void speakEnglish(){ 18 System.out.println("我是教練,我說英語......"); 19 } 20 } 21 class Demo { 22 public static void main(String[] args) { 23 Student stu = new Student(); 24 method(stu); 25 Player p = new Player(); 26 method(p); 27 //由于Coach沒有實現English接口,所以它不是English類型的。不能作為實參傳遞 28 Coach c = new Coach(); 29 // method(c); 30 } 31 //使用接口作為方法的形參;意味著:這個方法可以接收:這個接口的子類對象的引用; 32 public static void method(English en){ 33 en.speakEnglish(); 34 } 35 }11 類名作為返回值類型
1 class Student{ 2 String name; 3 } 4 class BasicStudent extends Student{ 5 } 6 class WorkStudent extends Student{ 7 } 8 class Demo { 9 public static void main(String[] args) { 10 Student s = method();//接收返回值//Student s = 0x2233 11 if(s != null){//如果調用的方法返回的是一個"引用類型",在使用前,最好先進行判斷; 12 System.out.println("name = " + s.name); 13 } 14 /由于方法返回的是"Student"類型,它可能返回Student對象的引用,也可能返回任何Student子類的對象的引用 15 //所以,由于不確定是哪個子類,所以不能用某個具體的子類變量接收,只能用Student來接收; 16 //此規則,同樣可以應用于"抽象類"和"接口"作為方法返回值的情況。 17 //BasicStudent bs = method();//編譯錯誤,不能用具體的子類類型來接收; 18 } 19 //一個方法的返回值類型聲明為一個類類型,意味著: 20 //1.這個方法必須返回一個此類對象的一個引用(常見);2.可以返回一個null;3.可以返回Student的子類對象的引用 21 public static Student method(){ 22 //return Student;//錯誤,需要返回一個引用 23 //1.可以返回一個Student對象的引用 24 /* 25 Student stu = new Student();//stu = 0x2233; 26 stu.name = "劉德華"; 27 return stu;//OK的 28 */ 29 //2.可以返回null 30 // return null;//OK的//return 0x2233 31 //3.可以返回一個子類引用 32 Student basicStu = new BasicStudent(); 33 basicStu.name = "章子怡"; 34 return basicStu; 35 } 36 }12 抽象類名作為返回值類型
1 abstract class Animal{ 2 String name; 3 } 4 class Cat extends Animal{ 5 } 6 class Dog extends Animal{ 7 } 8 class Demo { 9 public static void main(String[] args) { 10 //由于不確定是某個具體的子類類型,所以,不能用子類類型來接收。 11 // Cat c = get(); 12 Animal a = get(); 13 if(a != null){ 14 System.out.println("main方法打印:" + a); 15 } 16 } 17 //方法的返回值類型為"抽象類"類型。意味著: 18 //1.這個方法會返回這個抽象類的子類對象的引用; 19 //2.null; 20 public static Animal get(){ 21 // return Animal;//錯誤的 22 // return new Animal();//錯誤的:抽象類不能被實例化 23 Cat c = new Cat(); 24 c.name = "波斯貓"; 25 return c; 26 } 27 }13 接口名作為返回值類型
1 interface IAnimal{ 2 void show(); 3 } 4 class Cat implements IAnimal{ 5 //重寫方法 6 public void show(){ 7 System.out.println("小貓喵喵......"); 8 } 9 } 10 class Dog implements IAnimal{ 11 //重寫方法 12 public void show(){ 13 System.out.println("小狗汪汪......"); 14 } 15 } 16 class Demo { 17 public static void main(String[] args) { 18 IAnimal a = get(); 19 if(a != null){ 20 a.show(); 21 } 22 } 23 //一個方法的返回值類型為:接口類型。意味著: 24 //1.此方法會返回此接口的子類對象的引用; 25 //2.null; 26 public static IAnimal get(){ 27 // return IAnimal;//錯誤 28 // return new IAnimal();//錯誤 29 // return new Cat();//OK的 30 return new Dog();//OK的 31 // return null;//OK的 32 } 33 }14 鏈式編程
1 interface IA{ 2 public int max(int a ,int b); 3 }s 4 class Student{ 5 String name; 6 int age; 7 Student(){ 8 } 9 Student(String name,int age){ 10 this.name = name; 11 this.age = age; 12 } 13 void show(){ 14 System.out.println("我叫:" + this.name + " 今年:" + this.age + "歲"); 15 } 16 } 17 class StudentTools{ 18 void print(Student stu){ 19 if(stu != null){ 20 System.out.println(stu.name + "," + stu.age); 21 } 22 } 23 Student getStudent(){ 24 Student stu = new Student("汪峰",23); 25 return stu; 26 } 27 } 28 class Demo { 29 public static void main(String[] args) { 30 /* 31 StudentTools st = new StudentTools(); 32 Student stu = new Student(); 33 stu.name = "章子怡"; 34 stu.age = 18; 35 st.print(stu); 36 */ 37 new StudentTools().print(new Student("張惠妹",20)); 38 // new StudentTools().getStudent().show(); 39 //分步驟寫 40 StudentTools st = new StudentTools(); 41 Student stu = st.getStudent(); 42 stu.show(); 43 //使用鏈式編程 44 new StudentTools().getStudent().show(); 45 // System.out.println("aaa"); 46 } 47 48 public static void print(){ 49 } 50 }?
轉載于:https://www.cnblogs.com/linmusen/p/4709252.html
總結
以上是生活随笔為你收集整理的java--面向对象(4)--黑马程序员的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么在泰山拍摄延时摄影?
- 下一篇: 怎么在泰山进行徒步旅行?