廖雪峰Java2面向对象编程-4抽象类和接口-2接口
1.接口的定义
抽象方法本质上是定义接口规范。
- 在抽象类中定义了一个抽象方法,子类中必须实现这个抽象方法。
public abstract class Person{
public abstract void run();
}
public class Student extends Person{
@Override
public void run(){}
}
public class Teacher extends Person{
@Override
public void run(){}
}
如果一个抽象类没有字段,所有方法全部是抽象方法,就可以把抽象类改写为接口interface。
- Java中使用interface声明一个接口
- 接口定义的方法默认是public abstract,不需要再写public abstract。
- 一个类实现interface使用implements
- 可以实现多个接口
- 一个interface可以继承自另一个interface
1.1定义接口
public interface Person{
public abstract void run();
}
public class Student implements Person{
@Override
public void run(){}
}
public class Teacher implements Person{
@Override
public void run(){}
}
1.2一个类实现多个接口
public interface Auto{}
public interface Type{}
public class Produce implements Auto,Type{}
1.3一个interface可以继承自另一个interface
interfaces继承自interface使用的extends,相当于扩展了接口的方法
public interface Person{
String getName();
}
public interface Student extends Person{
String getSchool();
}
public class PrimaryStudent implements Person{
@Override
public String getName(){...}
@Override
public String getSchool(){...}
}
1.4.实例
Shape.java
public interface Shape {
//抽象方法,用于计算面积
double area();
//不想在每个类中都实现perimeter方法,可以将该方法定义为default方法
default double perimeter(){
return 0;
};
}
Rect.java
public class Rect implements Shape{
private final double width;
private final double height;
public Rect(double width, double height){
this.height = height;
this.width = width;
}
@Override
public double area() {
return width * height;
}
}
Circle.java
public class Circle implements Shape{
private double radius;
public Circle(double radius){
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
}
Hello.java
public class Hello {
public static void main(String[] args){
Shape s1 = new Rect(200,100);//可以用接口类型声明实例
Shape s2 = new Circle(60);
System.out.println(s1.area());
System.out.println(s2.area());
}
}
合理设计interface和abstract class的继承关系
* 公共逻辑放在abstract class
* 接口层次代表抽象程度
2.接口和编程接口的区别
注意区分术语: * Java的接口特质interface定义的接口,只定义方法签名 * 编程接口泛指接口规范,如方法签名,数据格式,网络协议等3.抽象类和接口的区别
abstract class | interface | |
---|---|---|
继承 | 只能extends一个class | 可以implements多个interface |
字段 | 可以定义实例字段 | 不能定义实例字段 |
抽象方法 | 可以定义抽象方法 | 可以定义抽象方法 |
非抽象方法 | 可以定义非抽象方法,即普通的实例方法 | 不能定义非抽象方法,但可以定义default方法 |
4.总结
- 接口定义了纯抽象规范
- 类可以实现多个接口
- 接口也是数据类型,适用于向上转型和向下转型
- 接口不能定义实例字段
- 接口可以定义default方法(JDK >= 1.8)