抽象类
介绍
在Java中,抽象类是一种不能直接被实例化的类,其目的是为了被子类继承并实现其抽象方法。抽象类通过关键字abstract
来定义,其中至少包含一个抽象方法,即没有实现体的方法。
语法
abstract class AbstractPlayer {
}
注意事项
- 抽象类不能直接被实例化,只能作为父类被继承。
- 抽象类中可以包含普通方法和属性,也可以包含抽象方法。
- 子类继承抽象类后,必须实现所有的抽象方法,否则子类也必须声明为抽象类。
- 抽象类可以有构造方法,但是不能被用于创建实例。
抽象方法
介绍
在 Java 中,抽象方法是一种没有具体实现的方法。它只有方法的声明,没有方法体。抽象方法用 abstract
关键字来修饰,只能定义在抽象类或接口中。抽象方法的存在是为了让子类来实现具体的方法。
语法
abstract class Shape {
abstract void draw();
}
注意事项
- 在抽象方法声明中,只需要指定方法名称、参数列表和返回类型,而不需要实现方法体。
当一个类继承了抽象类或接口时,必须实现其中的所有抽象方法,否则该类也必须声明为抽象类。 - 抽象方法不能用 final 、static 和 private 修饰符来定义,因为抽象方法的主要作用就是让子类实现。
如果使用了这些修饰符,就无法让子类继承该方法。
接口
介绍
在Java编程语言中,接口是一种特殊的抽象类。与抽象类一样,接口也不能被实例化,而只能被实现(抽象类只能被继承)。
语法
public interface MyInterface {
void myMethod();
}
特点
- 多继承
- 多实现
- 定规范
成员
- 实现接口的类必须实现接口中所有的抽象方法,否则该类也必须声明为抽象类
- 接口中的字段都是常量,不能被修改
- 默认方法(
default
)是指在接口中有方法体的普通方法,可以被接口的实现类继承或重写(不是强制)。 - 静态方法(
static
)是指在接口中有方法体的静态方法,只能通过接口的引用访问,因为静态方法不会被继承 - 重写了超类Object类中任意一个public方法的方法并不算接口中的抽象方法
注意事项
- 接口的主要作用是定义规范和契约,通过接口可以实现组件之间的松耦合
- 接口可以继承(
extends
)多个接口,用逗号分隔 - 类可以实现(
implements
)多个接口,用逗号分隔 - 接口中的方法默认使用
public
和abstract
关键字修饰 - 当子接口(实现类)的多个父接口中都有相同名称的默认方法,子接口(实现类)必须重写这个默认方法
补充
缩小实现接口(包括抽象类)的方法数量
当只需要实现父接口的5种方法,但是父接口有10种方法。
可以定义一个子接口继承父接口,使用默认方法(default
)实现父接口的5种方法,这样就只需要实现父接口剩下的5种方法
注意:接口继承的作用是扩展接口的功能,而不是缩小实现接口的方法数量
抽象类案例
public class Test {
public static void main(String[] args) {
B b = new B() {
@Override
void b() {
System.out.println("子类");
}
};
b.a();
b.b();
}
static <T> void test(T t){
}
}
abstract class A {
abstract void a();
abstract void b();
}
abstract class B extends A {
void a(){
System.out.println("B类");
}
}
接口案例
public class Test {
public static void main(String[] args) {
B b = () -> System.out.println("子类");
b.a();
b.b();
}
}
interface A {
void a();
void b();
}
interface B extends A {
default void a(){
System.out.println("B类");
}
}
为什么接口会有默认方法
解决了接口污染的问题
如果接口扩展了一个抽象方法,但是部分实现类只能进行空实现。
那么这就是接口污染问题,解决方法使用默认方法