1.接口主要有如下用途:
1)定义变量,也可用于进行强制类型转换 ①
2)调用接口中定义的常量
3)被其他类实现
2.一个类可以实现一个或多个接口,实现使用implements关键字。注:一个类实现了接口以后,这个类必须实现接口里的全部抽象方法,否则,这个类就变为了抽象类。
public interface Output{
int MAX_CACHE_LINE = 2; //成员变量
void out(); //定义一个抽象方法void
void getdata(String msg); //定义一个抽象方法getdata
default void print(String...msgs){ //定义一个默认方法print。这个默认方法的作用是打印数组
for(String msg:msgs){
System.out.println(msg);
}
}
default void test(){ //定义一个默认方法
System.out.println("Peniess");
}
}
interface Product{
int getProductTime(); //定义一个抽象方法
}
public class Printer implements Output,Product{
private String[] printData = new String[MAX_CACHE_LINE]; //定义一个数组成员变量
private int dataNum;
public void out(){ //重写void方法
while(dataNum>0){
System.out.println("打印机打印"+printData[0]); //每次都打印第一个数组
System.arraycopy(printData,1,printData,0,--dataNum); //每打印一次数组都向左移动一位,然后减1数组长度
}
}
public void getdata(String msg){ //重写getdata方法
if(dataNum>=MAX_CACHE_LINE)
{
System.out.println("输出队列已满,添加失败");
}
else
{
printdata[dataNum++] = msg; //每次都往printdata数组里面保存一个变量,并把数组长度加1。
}
}
public int getProductTime(){ //重写getProductTime方法
return 45;
}
public static void main(String[] args){
Output o = new Printer(); //创建Printer的对象并把它引用为Output 体现了①
o.getdata("算法导论");
o.getdata("thinking in java");
o.out();
o.getdata("算法");
o.getdata("算法珠玑");
o.out();
o.print("孙悟空","猪八戒","白骨精");
o.test();
Product p = new Printer(); //创建Printer的对象并把它引用为Product。体现了多态
System.out.println(p.getProductTime());
Object obj = p; //向上转型
Object obj2 = o;
}
}
注:实现接口方法时,必须使用public访问控制修饰符。(因为接口方法都是public修饰,重写的方法只能和public相等或更大
3.接口和抽象类
1)接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。
2)接口和抽象类都可以包含抽象方法,如果定义子类为普通类,那么都要实现这些方法,否则子类要被定义为抽象类。
4.接口和抽象类的不同
1)接口只能有抽象方法,类方法和默认方法,而抽象类完全可以包含普通方法。
2)接口里只能定义静态常量,不能定义普通成员变量,而抽象类既可以定义静态常量,也可以定义普通成员变量。(常量——final修饰)
3)接口不包含构造器,但抽象类可以包含构造器。(抽象类的构造器不是用于创建本类实例,而是用来被子类调用)
4)接口里不能有初始化块。
5)一个类只能有一个直接父类,但接口可以继承多个接口。