java學習——抽象類與介面的應用
阿新 • • 發佈:2020-12-09
抽象類與介面的區別
抽象類應用——模板設計模式
介面的實際應用——標準
介面的應用——工廠設計模式(Factory)
介面的應用——代理設計模式(Proxy)
NO. | #####區別 ###### | 抽象類 | 介面 |
---|---|---|---|
1 | 關鍵字 | abstract class | interface |
2 | 組成 | 構造方法、普通方法、抽象方法、static方法、常量、變數 | 抽象方法、全域性變數 |
3 | 子類使用 | class子類 extends 抽象類 | class 子類 implements 介面,介面,… |
4 | 許可權 | 可以使用各種許可權 | 只能使用public許可權 |
5 | 關係 | 抽象類可以實現多個介面 | 介面不能繼承抽象類,卻可以繼承多個父介面 |
6 | 限制 | 但繼承侷限 | 沒有但繼承侷限 |
7 | 子類 | 抽象類和介面都必須有子類,子類必須要重寫全部的抽象方法 | 抽象類和介面都必須有子類,子類必須要重寫全部的抽象方法 |
8 | 例項化物件 | 依靠子類物件的向上轉型進行物件的例項化 | 依靠子類物件的向上轉型進行物件的例項化 |
抽象類應用——模板設計模式
package test;
public class testAbstract {
public static void main(String[] args) {
fun(new Robot()); //傳遞機器人行為子類
fun(new Person()); //傳遞人類行為子類
fun (new Pig()); //傳遞豬行為子類
}
public static void fun(Action act){
act.command(Action.EAT);
act.command(Action.SLEEP);
act.command(Action.WORK);
}
}
abstract class Action{ //定義一個抽象的行為類,行為不是具體的
public static final int EAT = 1;
public static final int SLEEP = 2;
public static final int WORK = 4;
public void command(int flag){
switch (flag){
case EAT:this.eat();break;
case SLEEP:this.sleep();break;
case WORK:this.work();break;
}
}
//定義三個抽象方法
public abstract void eat();
public abstract void sleep();
public abstract void work();
}
class Robot extends Action{
//重寫父類的抽象方法
@Override
public void eat() {
System.out.println("機器人靠充電補充能量");
}
@Override
public void sleep() {
}
@Override
public void work() {
System.out.println("機器人可以不停的工作");
}
}
class Person extends Action{
@Override
public void eat() {
System.out.println("人類靠吃飯補充能量");
}
@Override
public void sleep() {
System.out.println("人類需要睡覺");
}
@Override
public void work() {
System.out.println("人類需要工作");
}
}
class Pig extends Action{
@Override
public void eat() {
System.out.println("豬隻知道吃");
}
@Override
public void sleep() {
System.out.println("豬吃完就睡");
}
@Override
public void work() {
}
}
介面的實際應用——標準
package test;
//介面的實際應用----標準
public class testInterface {
public static void main(String[] args) {
Computer computer = new Computer();//例項化電腦物件
computer.plugin(new flash()); //插入USB介面裝置
computer.plugin(new print()); //插入USB介面裝置
}
}
//定義USB標準
interface USB{
public void start();//USB開始工作
public void stop();//USB停止工作
}
//定義計算機類
class Computer{
public void plugin(USB usb){ //插入USB介面裝置(子類物件)
usb.start();
usb.stop();
}
}
//定義U盤子類
class flash implements USB{
@Override
public void start() {
System.out.println("U盤開始使用");
}
@Override
public void stop() {
System.out.println("U盤停止使用");
}
}
//定義印表機
class print implements USB{
@Override
public void start() {
System.out.println("印表機開始工作");
}
@Override
public void stop() {
System.out.println("印表機停止工作");
}
}
介面的應用——工廠設計模式(Factory)
package test;
//工廠設計模式
public class testFactory {
public static void main(String[] args) {
fruit f = Factory.getInstance("Apple");
f.eat();
f = Factory.getInstance("Orange");
f.eat();
}
}
//定義工廠類,此類不再產生新的屬性
class Factory{
/**
* 取得指定型別的介面物件
* @param className 要取得的類例項化物件標記
* @return 如果指定標記存在,則返回fruit介面的例項化物件,否則返回null
*/
public static fruit getInstance(String className){
if ("Apple".equals(className)){ //是否為蘋果類
return new Apple();
}else if ("Orange".equals(className)){ //是否為橘子類
return new Orange();
}else {
return null;
}
}
}
interface fruit{
public abstract void eat(); //定義抽象方法
}
class Apple implements fruit{ //定義介面子類
@Override
public void eat() { //重寫抽象方法
System.out.println("jack正在吃蘋果");
}
}
class Orange implements fruit{
@Override
public void eat() {
System.out.println("tom正在吃橘子");
}
}
介面的應用——代理設計模式(Proxy)
package test;
//介面的應用----代理
public class testProxy {
public static void main(String[] args) {
network net = null; //定義介面物件
net = new Proxy(new Real()); //例項化代理,同時傳入代理的真實操作
net.browser(); //客戶只關心上網瀏覽這一個功能
}
}
//定義network介面
interface network{
public void browser(); //定義瀏覽的抽象方法
}
class Real implements network{ //真實的上網操作
@Override
public void browser() { //重寫抽象方法
System.out.println("我正在網上瀏覽資訊");
}
}
class Proxy implements network{ //代理上網
private network net;
public Proxy(network net){ //設定代理的真實操作
this.net = net; //設定代理的子類
}
public void check(){ //檢查用的是哪個運營商代理
System.out.println("我正在使用移動的資料網");
}
@Override
public void browser() {
this.check();
this.net.browser();
}
}