商苑面馆:Java接口
目录
接口的定义
接口是由常量和抽象方法组成的特殊类
接口的格式如下:
[public] interface 接口名 [extends 接口1,接口2…] { [public] [static] [final] 数据类型 常量名=常量值; [public] [static] [abstract] 返回值 抽象方法名(参数列表); }
为什么使用接口
隐藏技术细节
在计算机中,Java 程序设计中的接口(Interface)也是一种规范,是用来组织应用程序中的类,并调节它们的相互关系。我们不需要知道程序内部实现的细节,只需要通过程序中提供的接口,就可以调用程序中相关的功能,实现我们想要的操作。
确保上层代码稳定
图书的业务处理需要对图书信息进行进行储存,并进行增加、删除、修改、查询等处理。但是随着我们项目的进展,图书信息可以被先后保存在内存中、文件中、数据库中,相应地,上述那些增删查改的底层操作方法可能会发生变化。为了保持上层业务的稳定性,避免因信息保存方式变化而修改上层业务代码,所以在我们的项目中通过接口描述图书增删查改处理,通过接口调用保持业务代码的稳定。
接口的简单应用
【实例5-10】接口实现程序设计。
打印机接口:
public interface Printer { //打印机接口 public void print(String content); }
黑白打印机类:(实现了打印机的接口)
public class BlackPrinter implements Printer { public void print(String content) { System.out.println("黑白打印:"); System.out.println(content); } }
彩色打印机类:(实现了打印机的接口)
public class ColorPrinter implements Printer{ public void print(String content) { System.out.println("彩色打印:"); System.out.println(content); } }
主类MainClass:
在这个主类里面,用户调用的接口的抽象方法print ,而非具体的实现类。
对用户而言,隐藏了底层的技术细节,从而实现了上层代码的稳定。
import entity.*; /*本类对应实训: */ public class MainClass { public static void main(String[] args) { Printer cp = new BlackPrinter(); //Printer cp = new ColorPrinter(); cp.print(" 创业计划书"); } }
接口回调:接口回调就是多态技术的体现。因此,接口回调可能产生不同的行为。
面馆实训
项目准备
点击项目右键 -> Copy ,
在‘项目列表’空白处右键 ->Paste (粘贴),复制原先的项目为一个新项目
在新项目中,对上一实训编写的类FoodDao,FoodDao2,FoodDao3,FoodDao4,FoodDao5根据各自使用技术分别改名为FoodDaoArray0,FoodDaoArray,FoodDaoLinked,FoodDaoSet,FoodDaoMap,用户类的那几个相应的改名为UserDaoArray0,UserDaoArray,UserDaoLinked,UserDaoSet,UserDaoMap
(类重命名的方法:单击类的名称,点击右键,Refactor -> Rename)
这些技术,对于用户来讲太复杂了,我们给他们建立个接口,把内部这些复杂细节隐藏起来。
新建接口FoodDao
点击包名 ,右键 -> New -> Interface ,新建一个接口FoodDao
package dao; import entity.Food; public interface FoodDao { public boolean addFoods(Food goods);//抽象方法1:增加商品,接口的实现类必须实现这个方法 public Food search(String s);//抽象方法2:搜索商品,接口的实现类必须实现这个方法 public String toString(); //抽象方法3:展示所有商品,接口的实现类必须实现这个方法 }
改造FoodDao接口的第1个实现类:FoodDaoArray
由昨天的FoodDao2改造而来,实现了接口的功能。
package dao; import java.util.*; import entity.*; public class FoodDaoArray implements FoodDao{ //private Food[] n;//食物数组 private ArrayList<Food> ;//食物数组 public FoodDaoArray( ){ this.n=new ArrayList<>(); } public FoodDaoArray(ArrayList<Food> n ){ this.n = n; } public boolean addFoods(Food f){//实现了接口的add方法 this.n.add(f); return true; } //按名称搜 public Food search(String s){//实现了接口的搜索方法 for(int i=0;i<this.n.size();i++){ if(n.get(i).getName().equals(s)){ return n.get(i); } } return null; //return new Noodle(); } public String toString(){//实现了接口的toString方法 String s=""; for(int i=0;i<n.size();i++){ s += n.get(i).toString()+"\r\n"; } return s; } public static void main(String[] args) { // TODO Auto-generated method stub } }
改造接口的第2个实现类:FoodDaoLinked
由昨天的FoodDao3改造而来,实现了接口的功能
import java.util.*; import entity.*; public class FoodDaoLinked implements FoodDao{ //private Food[] n;//食物数组 private LinkedList<Food> n ;//食物数组 public FoodDaoLinked( ){ this.n = new LinkedList<>(); } public FoodDaoLinked(LinkedList<Food> n ){ this.n = n; } public boolean addFoods(Food f){//实现了接口的add方法 this.n.add(f); return true; } //按名称搜 public Food search(String s){//实现了接口的搜索方法 for(int i=0;i<this.n.size();i++){ if(n.get(i).getName().equals(s)){ return n.get(i); } } return null; //return new Noodle(); } public String toString(){//实现了接口的toString方法 String s=""; for(int i=0;i<n.size();i++){ s += n.get(i).toString()+"\r\n"; } return s; } public static void main(String[] args) { // TODO Auto-generated method stub } }
新建测试类Main
新建测试类Main,在这里面对刚才的接口进行测试。
可以看到,在这里隐藏了ArrayList等具体的实现细节,用户看到的只是FoodDao这个接口
package dao; import java.util.Scanner; import entity.Food; import entity.Noodle; /*本类对应实训: */ public class Main { public static void main(String[] args) { //Printer cp = new BlackPrinter(); //数组初始化 Food f1 = new Noodle("炸酱面",12.0,3,"不辣"); Food f2 =new Noodle("臊子面",14.0,2,"麻辣"); Food f3 = new Noodle("刀削面",10.0,5,"微辣"); //FoodDao f = new FoodDaoArray();//用数组列表f初始化食物仓库foodset FoodDao f = new FoodDaoLinked();//用数组列表f初始化食物仓库foodset f.addFoods(f1);f.addFoods(f2);f.addFoods(f3); System.out.println(f.toString());//调用toString方法 //接收用户输入 Scanner scan = new Scanner(System.in); System.out.println("您想点什么餐品?"); String meal = scan.next(); System.out.println("输入的数据为:" + meal); //按名称搜索,调用search方法 Food n01 = f.search(meal); if(n01 != null) { System.out.println("餐品详细信息为:"+n01.toString()); System.out.println("请付钱!"); }else { System.out.println("对不起,我们店现在没有这种面"); } scan.close(); } }
课下练习
小组两个同学分工,新建你自己商品仓库的接口 ***Dao(***替换为自己商品名称) 和用户类的接口 UserDao,改写昨天FoodDaoArray,FoodDaoLinked和用户数据库的UserDaoArray,UserDaoLinked,作为它的实现类。改写完之后仿照上例,新建个Main类测试一下。