参考:https://how2j.cn/k/interface-inheritance/interface-inheritance-override/309.html?p=136471
一.抽象类(abstract)
以abstract修饰的方法或类即为抽象方法或抽象类
在类中声明一个没有实现体的方法,这样的方法就叫抽象方法,使用修饰符“abstract"
当一个类有抽象方法的时候,该类必须被声明为抽象类,抽象类的子类就必须重写抽象方法
-
抽象方法
没有方法体(花括号也不要),必须定义在抽象类中或接口中 -
抽象类
结构和普通类差不多,也可以有普通的属性和方法
抽象类不能被实例化,抽象类在使用时必须派生子类,并在子类中重写抽象方法,抽象类必须有子类才有意义
定义一个抽象类
public abstract class Hero {
// 抽象方法attack
// Hero的子类会被要求实现attack方法
public abstract void attack();
}
实现类
public class ADAPHero extends Hero implements AD, AP {
@Override // 重写父类中的抽象方法
public void attack() {
System.out.println("既可以进行物理攻击,也可以进行魔法攻击");
}
}
二.接口
接口是一种规范,用于规定一组必须实现的方法,使用关键字interface定义,区别于抽象类的是,一个类可以实现多个接口
接口中除了定义"空"方法,也可以定义默认方法(default)
默认方法的好处:引入了默认方法后,实现类中不需要做任何改动,并且还能得到这个默认方法
// 新建一个接口,约定需要实现的方法,接口中不写方法体
public interface AD {
public void physicAttack(); // 没有花括号
default public void revive() { // 使用default关键字定义默认方法
System.out.println("本英雄复活了");
}
}
实现类 implements
// implements关键字进行接口的实现,重写接口中约定的方法
public class ADHero extends Hero implements AD,AP {
@Override
public void physicAttack(){
System.out.println("实现physicAttack接口");
}
// 如果实现类继承了多个接口,接口中都提供了相同的默认方法,那么实现类中需要重写,不然java不知道要去调用哪个接口的默认方法
@Override
public void attack(){ // 重写默认方法,并指明调用哪个接口的默认方法
AD.super.attack();
}
}
在java中,只可以有一个父类,但可以同时实现多个接口
接口中定义的变量都是静态的全局变量(所以一般不这么用),需要初始化(类中定义的变量可以不初始化);
三、区别
1.子类只能继承一个抽象类,不能继承多个;而子类可以实现多个接口
2.抽象类可以定义 public,protected,package,private ,静态和非静态属性, final和非final属性
但是接口中声明的属性,只能是 public static final 的,即便没有显式的声明
抽象类和接口都可以有实体方法。 接口中的实体方法,叫做默认方法,使用关键字default