相同点
- 接口和抽象类都是为了将方法进行抽象,让子类去实现,所以都可以定义抽象方法
- 抽象类和接口都不能实例化,需要子类去实例化
不同点
- 接口使用implements关键字,抽象类使用extends关键字
- 抽象类可以实现接口,接口只能继承接口,接口不能继承类,一个类只能有一个父类,但能有多个接口
- 子类实现接口后,只能做重写方法
- 接口不能有构造器,只能定义public static final 修饰的静态常量
- 子类继承抽象类后,将父类的成员属性,成员方法也继承过来了
- 抽象类可以有构造器,可以限定子类的构造行为
//接口A
public interface A {
public int Away(int a);
}
//接口B
public interface B {
public int Bway();
}
//子类实现接口A,B
public class test implements A,B {
@Override
public int Away(int a) {
int b = a*a;
return b;
}
@Override
public int Bway() {
System.out.println("无参方法");
return 0;
}
//测试:子类实例化
public static void main(String[] args) {
test test = new test();
System.out.println(test.Away(5));
test.Bway();
}
}
接口能干什么
//抽象类
public abstract class aa {
//抽象类构造器
public aa(String string) {
this.string = string;
}
//成员变量
public String string;
//抽象方法,需要子类实现
public abstract int add(int b);
//抽象方法
public int abstrackWay(int a){
return a*10;
}
}
//子类
public class Exe extends aa {
@Override
public int add(int b) {
return b+10;
}
//继承抽象类构造器
public Exe(String string) {
super(string);
}
}
//测试,子类实例化
public static void main(String[] args) {
Exe exe = new Exe("jmh"); //通过抽象类构造器对实例化对象赋值
exe.abstrackWay(10); //抽象类方法
exe.add(20); //子类实现抽象类的方法
exe.string; //抽象类的成员属性
}
抽象类能干什么
可以看出接口就是更加纯粹的抽象类,接口只能定义子类去实现方法,更规范
default关键字
出现原因:Java8在原有接口中添加了许多新的方法,如果在继承该接口的子类中不去实现该方法,那么就会报错,为了保证向下兼容,被default关键字抽象的方法就不是抽象方法了,也就不会强制要求已有的子类去实现方法,但是子类可以去重写default修饰的方法
public interface A {
public int Away(int a);
default void defaultWay(){
System.out.println("默认方法");
}
}
什么时候用抽象类,什么时候用接口
需要让子类继承成员变量,需要控制子类的实例化,用抽象类
否则,用接口