(1)接口的概念
所有的接口的功能都必须遵守接口类中定义的功能 即:接口对接口类的功能进行方法覆盖
1.接口使用的流程-关键字interface 定义接口类
关键字implements 定义接口类的接口
package hello;
interface Printable{//定义了一个叫Printable的接口类 该类无法创建对象(实例)
void print();//接口的方法称为抽象方法 是没有方法体的 并且隐式修饰为 public和abstract
}
class Printer implements Printable{//使Printer成为Printable的接口 关系类似于父子类
@Override
public void print() {//在接口中必须进行方法覆盖 就像是契约一样
System.out.println("Hello");
}
}
public class Hello{ //创建一个类叫做Hello
public static void main(String[] args) {
Printer a = new Printer();
a.print();//Hello
System.out.println(a instanceof Printable);//返回true 表示Printer的实例也是
//Printable的实例
}
}
2.接口字段
1.接口字段必须初始化
2.接口字段隐含public static final 的修饰
3.接口字段名一般大写
interface Printable{//定义了一个叫Printable的接口类 该类无法创建对象(实例)
int STATUS=1; //接口字段必须初始化
//接口字段隐含public static final 的修饰
//接口字段名一般大写
public void print();
}
3.接口的抽象方法
interface Printable{//定义了一个叫Printable的接口类 该类无法创建对象(实例)
void print();//接口的方法称为抽象方法 是没有方法体的 并且隐式修饰为 public和abstract
}
4.扩展接口
在下例代码中 a是b的直接超接口,b是a的子接口,c继承了b,所以c是b的间接子接口
interface a{//定义了一个叫Printable的接口类 该类无法创建对象(实例)
public void print();
}
class b implements a{//使Printer成为Printable的接口 关系类似于父子类
@Override
public void print() {//在接口中必须进行方法覆盖 就像是契约一样
System.out.println("Hello");
}
}
class c extends b{
}
(2)基类
因为每次扩展接口时都要将抽象方法全部覆盖一遍,但其实我们只需要其中的一到两种这样就会非常麻烦,代码也会变得极长无比,
解决方法
用默认代码实现接口的抽象方法称为通用实现类(基类),然后通过一个子接口(实现类)扩展通用实现类这样就可以覆盖它希望修改的方法
例子.比如想使用javax.servlet.Servlet中一共有5种方法,但是你想用其中的一种就要将5种方法全部覆盖一遍,这时用javax.servlet.GenericServlet就可以实现方法单一调用了
(3)抽象类 -关键字abstract 定义抽象类
package hello;
abstract class Printer {//创建一个叫Printer的抽象类 该类也不能创建对象(实例)只能通过子
//类进行实例化
@Override
public String toString(){//定义默认方法 该方法不会被子类进行方法覆盖
return "Hello";
}
public abstract void print();//抽象方法
}
class Emm extends Printer{
public void print() {//和接口类似,在其子类进行方法覆盖
}
}
public class Hello{ //创建一个类叫做Hello
public static void main(String[] args) {
Emm a = new Emm();
System.out.println(a.toString());//Hello
}
}
2.使用抽象类的理由
1.如果想阻止一个方法被覆盖,可以在抽象类中添加final方法,在接口中不行.
2.在抽象类中可以使用字段保存对象状态,相反在接口中的字段隐式定义是public static,所以它们的值在实现类的所有实例中共享
3.在抽象类中可以定义构造方法,在接口中不行