3.7、抽象類與接口的實際應用{百分百的重點}
開發原則:
在類的開發之中,一個類不會去繼承一個已經實現好的類,只會繼承抽象類或實現接口。
即:以下的代碼是不應該出現在程序之中的:
class A{}
class B extends A{} |
3.7.1 、抽象類實際應用
抽象類本身是不能直接實例化的。因爲其本身包含抽象方法。
但是抽象類的時候符合繼承關係,只要有繼承關係,則肯定會存在對象的向上或向下轉型的問題,一但對象發生了向上轉型,則肯定一切的方法以被子類覆寫過的方法爲準。
abstract class A{
public abstract void fun() ;
};
class B extends A{
public void fun(){
System.out.println("Hello World!!!") ;
}
};
public class Demo32{
public static void main(String args[]){
A a = new B() ;
a.fun() ;
}
}; |
從以上代碼之中可以發現,抽象類可以實例化,但是需要通過對象的多態性,通過子類進行實例化操作。
那麼能用抽象類做什麼呢?
違紀卡 | |||
姓名: |
李興華 |
班級: |
小班1006 |
時間: |
|
事由: |
上課吃飯 |
以後要是取數據的時候,直接從用戶填寫的地方取,因爲上面規定出了是一個模板。
實際上抽象類就是提供了此種類型的代碼結構。
例如:人分爲工人和學生,工人和學生都有說話方法,但是說話的內容要由工人或學生決定,所以此時就可以使用抽象類完成此種功能。
abstract class Person{
private String name ;
private int age ;
public Person(String name,int age){
this.name = name ;
this.age = age ;
}
public void say(){
System.out.println(this.getContent()) ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
public abstract String getContent() ;
};
class Worker extends Person{
private float salary ;
public Worker(String name,int age,float salary){
super(name,age) ;
this.salary = salary ;
}
public String getContent(){
return "工人說 --> 姓名:"+this.getName()+",年齡:"+this.getAge()+",工資:"+this.salary ;
}
};
class Student extends Person{
private float score ;
public Student(String name,int age,float score){
super(name,age) ;
this.score = score ;
}
public String getContent(){
return "學生說 --> 姓名:"+this.getName()+",年齡:"+this.getAge()+",成績:"+this.score ;
}
};
public class Demo33{
public static void main(String args[]){
Person p = null ;
// p = new Student("張三",20,
p = new Worker("張三",
p.say() ;
}
}; |
練習:
只要是學生進入到班級裏來,就一定要喊報告。
只要是老師進入到班級裏來,也一定要說同學們好。
abstract class Person{
private String name ;
public Person(String name){
this.name = name ;
}
public void call(){
System.out.println(this.getContent()) ;
}
public String getName(){
return this.name ;
}
public abstract String getContent() ;
};
class Teacher extends Person{
public Teacher(String name){
super(name) ;
}
public String getContent(){
return "同學們好,姓名:"+this.getName() ;
}
};
class Student extends Person{
public Student(String name){
super(name) ;
}
public String getContent(){
return "報告,姓名:"+this.getName() ;
}
};
class Class_{
public void comeIn(Person p){
p.call() ;
}
};
public class Demo34{
public static void main(String args[]){
Class_ c = new Class_() ;
c.comeIn(new Student("張三")) ;
c.comeIn(new Teacher("李四")) ;
}
}; |
以上的設計模式就稱爲模板設計。
3.7.2 、接口的實際應用
總的使用原則:接口的作用就是將方法名稱暴露給遠程用戶。
接口與抽象類一樣,如果要想正確的時候也需要通過子類進行實例化操作。
如下代碼所示:
interface A{
public void print() ;
}
class B implements A{
public void print(){
System.out.println("Hello World!!!") ;
}
};
public class Demo35{
public static void main(String args[]){
A a = new B() ;
a.print() ;
}
}; |
接口的實際應用:定義標準。
以USB接口爲例:
interface USB{
public void start() ;
public void stop() ;
}
class MainBoard{
public void plugIn(USB usb){
usb.start() ;
usb.stop() ;
}
};
class Mp3 implements USB{
public void start(){
System.out.println("MP3開始工作。") ;
}
public void stop(){
System.out.println("MP3停止工作。") ;
}
};
class Print implements USB{
public void start(){
System.out.println("打印機開始工作。") ;
}
public void stop(){
System.out.println("打印機停止工作。") ;
}
};
public class Demo36{
public static void main(String args[]){
MainBoard mb = new MainBoard() ;
mb.plugIn(new Mp3()) ;
mb.plugIn(new Print()) ;
}
}; |