接口
接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
接口如何定义
interface声明接口
public interface MyInterface //声明接口
接口的作用
- 1.定义接口有利于代码的规范
- 2.有利于对代码进行维护
- 3.保证代码的安全和严密
接口特性
- 接口不可以被实例化
- 实现类必须实现接口的所有方法
- 实现类可以实现多个接口
- implements、多个接口使用逗号隔开
- 接口中的变量都是静态常量(public static final)
抽象类VS接口
相同点:
- 代表系统的抽象层
- 都不能被实例化
- 都能包含抽象方法
- 用于描述系统提供的服务,不必提供具体实现
不同点:
- 在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法
- 一个类只能继承一个直接的父亲,但可以实现多个接口
- 已存在的继承树,可以方便的抽取接口,但是抽取抽象类不容易
- 接口使用原则
- 接口做系统与外界交互的窗口 接口提供服务
- 接口本身一旦制定,就不允许随意更改
- 抽象类可完成部分功能实现,还有部分功能可作为系统的扩展点
内部类
在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。
成员内部类
成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
局部内部类
局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
匿名内部类
匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护
静态内部类
静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法,这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。
小练习
1.原始的手机,可以发短信,通电话。随着发展,手机增加了功能:音频、视频播放、拍照、上网。使用接口实现手机功能
//可以这样说所有的手机都能打电话发短信所以我们定义一个抽象类 public abstract class Phonedian { //打电话 public abstract void call(); //发短息 public abstract void message(); }
//智能机拥有一些新的功能所以我们把功能放到接口中 public interface NewFunction { //音乐功能 public abstract void music(); //视频功能 public abstract void video(); //拍照功能 public abstract void photo(); //上网功能 public abstract void internet(); }
//创建一个手机类继承并实现接口 public class SuoPhone extends Phonedian implements NewFunction{ @Override public void music() { System.out.println("播放音乐《小时代》"); } @Override public void video() { System.out.println("播放视频《复仇者联盟》"); } @Override public void photo() { System.out.println("正在拍照"); } @Override public void internet() { System.out.println("您已联网"); } @Override public void call() { System.out.println("您正在通话"); } @Override public void message() { System.out.println("发送短信成功"); }
//最后我们在测试类中测试 public class TestSuo { public static void main(String[] args) { SuoPhone suo=new SuoPhone(); System.out.println("这是一款索尼爱立信手机"); suo.music(); suo.message(); suo.call(); } }
2.实现打印机功能,打印机字体有彩色字体还有黑色字体,纸张有A4和纸张的限定条件(一行打印15个字符一共5行,不够一页的空格补满),使用接口实现打印机功能
//1.定义字体颜色的接口 public interface Ink { //返回颜色 public String getColor(int r,int g,int b); }
1 //这里就写一个实现接口的代码,如有需要可以仿照写 2 //2.实现Ink接口 彩色 3 public class ColourColor implements Ink{ 4 5 @Override 6 public String getColor(int r, int g, int b) { 7 Color color=new Color(r,g,b); 8 return "#"+Integer.toHexString(color.getRGB()).substring(2); 9 } 10 11 }
1 //3.定义纸张的接口 2 public interface Paper { 3 4 String kongge="\n"; 5 //写入 6 public void wirteWord(char word); 7 //读取 8 public String getContent(); 9 10 }
//4.实现接口定义的两个纸张方法(题目要求) public class PaperSpecifications implements Paper{ int line=15;//行 int vertical=5;//竖 int paper=1;//页码 int x=0; int y=0; String content=""; @Override public void wirteWord(char word) {//判断行、竖的要求 content+=word; x++;//获取到的字符位置逐渐增加 if(x==line){ content+=kongge; x=0; y++; } if(y==vertical){ content+="=======第"+paper+"页======="; y=0; paper++; content+=kongge+kongge; } } @Override public String getContent() {//获取不满5列用空格补满 if(!(x==0&&y==0)){ int count=vertical-y; for (int i = 0; i <count; i++) { content+=kongge; } content+="=======第"+paper+"页======="; } return content; } }
//5.组装打印机 public class Printer { //添加墨盒跟纸张 private Paper paper; private Ink ink; public void print(String content){//打印 System.out.println("该打印机使用的颜色是:"+ink.getColor(80, 60, 50)); for (int i = 0; i < content.length(); i++) {//循环读取写入的字符 char c=content.charAt(i); paper.wirteWord(c);//把得到的字符写入 } System.out.println(paper.getContent());//输出得到的字符 } public Paper getPaper() { return paper; } public void setPaper(Paper paper) { this.paper = paper; } public Ink getInk() { return ink; } public void setInk(Ink ink) { this.ink = ink; }
//6.最后就是我们的测试类了 public class Test { public static void main(String[] args) { Scanner input=new Scanner(System.in); System.out.println("请输入要打印的字:"); String str=input.next(); //准备墨盒 Ink ink=new ColourColor(); //准备纸张 Paper paper=new PaperSpecifications(); //实例化打印机 Printer printer=new Printer(); //添加颜色 printer.setInk(ink); //添加纸张 printer.setPaper(paper); //输出打印的字符 printer.print(str); } }
就写这么多了,希望大佬不要打脸....
努力到无能为力,拼搏到感动自己