商苑面馆:Java接口

来自CloudWiki
跳转至: 导航搜索

接口的定义

接口是由常量和抽象方法组成的特殊类

接口的格式如下:

[public]  interface  接口名 [extends 接口1,接口2…] {

   [public]  [static]  [final] 数据类型 常量名=常量值;

   [public]  [static]  [abstract] 返回值 抽象方法名(参数列表);

}

为什么使用接口

隐藏技术细节

在计算机中,Java 程序设计中的接口(Interface)也是一种规范,是用来组织应用程序中的类,并调节它们的相互关系。我们不需要知道程序内部实现的细节,只需要通过程序中提供的接口,就可以调用程序中相关的功能,实现我们想要的操作。

确保上层代码稳定

图书的业务处理需要对图书信息进行进行储存,并进行增加、删除、修改、查询等处理。但是随着我们项目的进展,图书信息可以被先后保存在内存中、文件中、数据库中,相应地,上述那些增删查改的底层操作方法可能会发生变化。为了保持上层业务的稳定性,避免因信息保存方式变化而修改上层业务代码,所以在我们的项目中通过接口描述图书增删查改处理,通过接口调用保持业务代码的稳定。

接口的简单应用

【实例5-10】接口实现程序设计。

Java5-2.png

打印机接口:

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类测试一下。