Java初学——面向对象接口的应用
一、接口
1.什么是接口
接口是比抽象类更抽象的定义,接口不可以被实例化 实现类必须实现接口的所有方法 实现类可以实现多个接口 、多个接口使用逗号隔开 接口中的变量都是静态常量(public static final) 程序设计时面向接口的约定而不考虑具体实现 。
2.为什么使用接口
有些事物具有相同的功能,多个类可以做相同的功能,程序设计中,要做到将功能模块化,细分化,这样有利于代码的改写,减少代码冗余度,接口和继承类似,但是继承具有单根性,所以有了接口这个定义。
3.怎么使用接口
接口中的成员变量 默认都是public static final的,必须显式初始化 接口中的方法 默认都是public abstract的 ,接口没有构造方法,不能被实例化 一个接口不能实现另一个接口,但可以继承多个其他接口 一个类必须实现接口抽象方法,除非这个类也是抽象类
4.接口与抽象类的区别
相同点 代表系统的抽象层 都不能被实例化 都能包含抽象方法 用于描述系统提供的服务,不必提供具体实现
不同点 在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法 抽象类便于复用,接口便于代码维护 一个类只能继承一个直接的父类,但可以实现多个接口
二、利用接口完成问题
问题:墨盒和纸张的规格是一种约定 打印机需要遵守这些约定 用面向接口编程的方式开发 制定墨盒、纸张的约定或标准 其他厂商按照墨盒、纸张的标准生产墨盒、纸张 打印机厂商使用墨盒、纸张的标准开发打印机
分析:墨盒和纸张规格是个接口,需要创建类去分别实现纸张和墨盒的接口,创建打印机类去组装墨盒和纸张打印,最后创建测试类
1.创建纸张接口
//纸张的接口 public interface Paper { String newline="\n";//纸张都会有换行符所以定义在接口里 //写入字符的功能 void putChar(char word); //读取纸张上内容的功能 String getContent(); }
2.创建墨盒的接口
//创建墨盒接口 public interface Ink { //返回指定颜色 String getColor(int r,int g,int b); }
3.实现墨盒接口
public class ColorInk implements Ink{ @Override public String getColor(int r, int g, int b) { Color color=new Color(r,g,b);//创建color对象 return "#"+Integer.toHexString(color.getRGB()).substring(2); } }
4.实现纸张接口
//纸张实现类 public class TextPaper implements Paper{ int linewords=16;//定义一行有16个字符 int rows=5;//一样有五行 int x=0; int y=0; int paper=1; String content=""; @Override public void putChar(char word) { content+=word; x++;//移动字符的位置 if(x==linewords){ content+=newline; x=0; y++; } if(y==rows){ content+="=======第"+paper+"页======="; paper++; y=0; content+=newline+newline; } } @Override public String getContent() { //获取内容的阶段 if(!(x==0&&y==0)){ //页中是否存在空行 lines-y=空行 \n int count=rows-y; for(int i=0;i<count;i++){ content+=newline; } content+="=======第"+paper+"页======="; } return content; } }
5.组装墨盒
//打印机类组装墨盒和纸张 public class Printer { private Ink ink; //墨盒 private Paper paper; //纸张 public void print(String content){ System.out.println("该打印机使用的颜色是:"+ink.getColor(50, 50, 50)); for (int i = 0; i < content.length(); i++) { char c=content.charAt(i); paper.putChar(c); } System.out.println(paper.getContent()); } public Ink getInk() { return ink; } public void setInk(Ink ink) { this.ink = ink; } public Paper getPaper() { return paper; } public void setPaper(Paper paper) { this.paper = paper; } }
6.创建测试类
public class Test { public static void main(String[] args) { //准备墨盒和纸张 Ink ink=new BlackInk(); Paper paper=new TextPaper(); Printer printer=new Printer(); printer.setInk(ink); printer.setPaper(paper); printer.print("2222222222222222222222222222222222222222222222222222222");//输入的文本 } }