抽象類和介面的區別:
阿新 • • 發佈:2018-11-19
抽象類和介面的區別:
A:成員區別
抽象類:
成員變數:可以變數,也可以常量
構造方法:有
成員方法:可以抽象,也可以非抽象
介面:
成員變數:只可以常量
成員方法:只可以抽象
B:關係區別
類與類
繼承,單繼承
類與介面
實現,單實現,多實現
介面與介面
繼承,單繼承,多繼承
C:設計理念區別
抽象類 被繼承體現的是:”is a”的關係。抽象類中定義的是該繼承體系的共性功能。
介面 被實現體現的是:”like a”的關係。介面中定義的是該繼承體系的擴充套件功能。
1 package day9; 2 3 /** 4 * Created by admin on 2018/11/17.5 * 介面的特點: 6 A:介面用關鍵字interface表示 7 interface 介面名 {} 8 B:類實現介面用implements表示 9 class 類名 implements 介面名 {} 10 C:介面不能例項化 11 那麼,介面如何例項化呢? 12 按照多型的方式來例項化。 13 D:介面的子類 14 a:可以是抽象類。但是意義不大。 15 b:可以是具體類。要重寫介面中的所有抽象方法。(推薦方案) 16 17 由此可見:18 A:具體類多型(幾乎沒有) 19 B:抽象類多型(常用) 20 C:介面多型(最常用) 21 */ 22 23 interface AnimalTrain { 24 void jump(); 25 } 26 27 //抽象類實現介面 28 abstract class Dogs implements AnimalTrain { 29 public void dogs(){ 30 System.out.println("this is dog"); 31 } 32 } 33 class Cats extendsDogs { 34 @Override 35 public void jump() { 36 System.out.println("this is jump"); 37 } 38 } 39 public class InterfaceDemo { 40 public static void main(String[] args){ 41 Dogs at = new Cats(); 42 at.jump(); 43 at.dogs(); 44 } 45 46 }
1 package day9; 2 3 /** 4 * Created by admin on 2018/11/17. 5 * 介面成員特點 6 成員變數;只能是常量,並且是靜態的。 7 預設修飾符:public static final 8 建議:自己手動給出。 9 構造方法:介面沒有構造方法。 10 成員方法:只能是抽象方法。 11 預設修飾符:public abstract 12 建議:自己手動給出。 13 14 所有的類都預設繼承自一個類:Object。 15 類 Object 是類層次結構的根類。每個類都使用 Object 作為超類。 16 */ 17 interface Inter{ 18 public int num = 10; 19 public final int num2 = 20; 20 public static final int num3 = 30; 21 22 //錯誤: 需要<識別符號> 23 //public Inter() {} 24 25 //介面方法不能帶有主體 26 //public void show() {} 27 28 //abstract void show(); //預設public 29 void show(); //預設abstract 30 } 31 //介面名+Impl這種格式是介面的實現類格式 32 /* 33 class InterImpl implements Inter { 34 public InterImpl() { 35 super(); 36 } 37 } 38 */ 39 class InterImpl implements Inter { 40 public InterImpl() { 41 super(); 42 } 43 public void show() {} 44 } 45 public class InterfaceDemo2 { 46 public static void main(String[] args) { 47 System.out.println(); 48 InterImpl i = new InterImpl(); 49 i.show(); 50 Inter it = new InterImpl(); 51 System.out.println(it.num); 52 System.out.println(it.num2); 53 System.out.println(it.num3); 54 } 55 }
1 package day9; 2 3 import com.sun.prism.impl.paint.PaintUtil; 4 import org.omg.CORBA.PUBLIC_MEMBER; 5 6 /** 7 * Created by admin on 2018/11/17. 8 * /* 9 老師和學生案例,加入抽菸的額外功能 10 11 分析:從具體到抽象 12 老師:姓名,年齡,吃飯,睡覺 13 學生:姓名,年齡,吃飯,睡覺 14 15 由於有共性功能,我們提取出一個父類,人類。 16 17 人類: 18 姓名,年齡 19 吃飯(); 20 睡覺(){} 21 22 抽菸的額外功能不是人或者老師,或者學生一開始就應該具備的,所以,我們把它定義為介面 23 24 抽菸介面。 25 26 部分老師抽菸:實現抽菸介面 27 部分學生抽菸:實現抽菸介面 28 29 實現:從抽象到具體 30 31 使用:具體 32 */ 33 34 interface Smoking { 35 void smoking(); 36 } 37 abstract class People { 38 String name; 39 int age; 40 public People(){} 41 public People(String name,int age){ 42 this.name = name; 43 this.age = age; 44 } 45 public String getName() { 46 return name; 47 } 48 49 public void setName(String name) { 50 this.name = name; 51 } 52 53 public int getAge() { 54 return age; 55 } 56 57 public void setAge(int age) { 58 this.age = age; 59 } 60 public abstract void eat(); 61 62 public void sleep(){ 63 System.out.println("sleep"); 64 } 65 } 66 67 class Teacher extends People implements Smoking{ 68 public Teacher(){} 69 public Teacher(String name,int age){ 70 super(name, age); 71 } 72 public void eat() { 73 System.out.println("Teacher eat baicai"); 74 } 75 public void smoking(){ 76 System.out.println("Teacher smoking"); 77 } 78 } 79 80 abstract class Students extends People implements Smoking { 81 public Students() {} 82 public Students(String name,int age) { 83 super(name, age); 84 } 85 86 } 87 public class InterfaceTest { 88 public static void main(String[] args) { 89 Teacher t = new Teacher("BOB",20); 90 System.out.println(t.getName() + t.getAge()); 91 t.eat(); 92 t.smoking(); 93 } 94 95 }