一、抽象类(强制子类覆写方法)
抽象类是普通类的“超集”,只是比普通类多了一些抽象方法而已(抽象方法个数:0-N)
抽象方法所在的类必须是抽象类,子类若是继承了抽象类,必须覆写所有的抽象方法(子类是普通类)
Java中定义抽象类或者抽象方法使用 abstract 关键字
1、抽象方法所在的类必须使用abstract声明为抽象类
抽象方法指的是1、使用abstract关键字声明,只有函数声明,没有函数实现的方法(2、没有方法体的方法),称为抽象方法。抽象类中没有具体实现,延迟到子类实现
public abstract class Sharp {
public abstract void print();
}
public class Cycle extends Sharp{
@Override
public void print() {
System.out.println("●");
}
}
public class Square extends Sharp{
@Override
public void print() {
System.out.println("■");
}
}
public class Test {
public static void test(Sharp sharp){
sharp.print();
}
public static void main(String[] args) {
test(new Cycle());
test(new Square());
}
}
子类必须覆写所有的抽象方法,否则就会报错
2、若一个类使用abstract关键字声明为抽象类,无法直接通过该类实例化对象,哪怕该类中一个抽象方法都没有。(当一个类是抽象类,不管有无抽象方法,该类本身就是一个抽象的概念,没法具体到某个特定的实例)只能通过子类向上转型变为抽象父类的引用。
3、子类继承了抽象类,就必须强制子类覆写抽象类中的所有抽象方法(子类是普通类)。也满足单继承局限,一个子类只能extends一个抽象类。
abstract class A{
public abstract void printA();
}
//抽象类B继承抽象类A
//A中的抽象方法,B可以覆写,也可以不覆写
//如果B覆写A的抽象方法,则C就不需要再继续覆写A的抽象方法
//如果B没有覆写A的抽象方法,则C既需要覆写B的抽象方法,也需要覆写A的抽象方法
abstract class B extends A{
public abstract void printB();
}
public class C extends B{
@Override
public void printA() {
}
@Override
public void printB() {
}
}
4、抽象类是普通类的“超集”(普通类有的内容,抽象类全都有),只是比普通类多了一些抽象方法而已。抽象类虽然没法直接实例化对象,但也存在构造方法,子类在实例化时,仍然遵从继承的规则,先调用父类的构造方法,而后调用子类的构造方法。
abstract class BaseTest{
public BaseTest(){
print();
}
abstract void print();
}
public class Fun extends BaseTest{
private int num = 10;
@Override
void print() {
//num = 0;
System.out.println("num = " + num);
}
public static void main(String[] args) {
Fun fun = new Fun();
}
}
二、接口
接口中只有全局常量(1%)和抽象方法(99%)—>更加纯粹的抽象概念。
接口使用关键字 interface 声明接口,子类使用 implements 实现接口(必须覆写所有的抽象方法)
1、接口使用的场景
(1)接口表示具备某种能力/行为,子类实现接口时不是满足 is a 关系&#