抽象类和抽象方法以及接口

抽象类和抽象方法以及接口

抽象类

介绍

在Java中,抽象类是一种不能直接被实例化的类,其目的是为了被子类继承并实现其抽象方法。抽象类通过关键字abstract来定义,其中至少包含一个抽象方法,即没有实现体的方法。

语法

abstract class AbstractPlayer {
}

注意事项

  1. 抽象类不能直接被实例化,只能作为父类被继承。
  2. 抽象类中可以包含普通方法和属性,也可以包含抽象方法。
  3. 子类继承抽象类后,必须实现所有的抽象方法,否则子类也必须声明为抽象类。
  4. 抽象类可以有构造方法,但是不能被用于创建实例。

抽象方法

介绍

在 Java 中,抽象方法是一种没有具体实现的方法。它只有方法的声明,没有方法体。抽象方法用 abstract 关键字来修饰,只能定义在抽象类或接口中。抽象方法的存在是为了让子类来实现具体的方法。

语法

abstract class Shape {
   abstract void draw();
}

注意事项

  1. 在抽象方法声明中,只需要指定方法名称、参数列表和返回类型,而不需要实现方法体。
    当一个类继承了抽象类或接口时,必须实现其中的所有抽象方法,否则该类也必须声明为抽象类。
  2. 抽象方法不能用 final 、static 和 private 修饰符来定义,因为抽象方法的主要作用就是让子类实现。
    如果使用了这些修饰符,就无法让子类继承该方法。

接口

介绍

在Java编程语言中,接口是一种特殊的抽象类。与抽象类一样,接口也不能被实例化,而只能被实现(抽象类只能被继承)。

语法

public interface MyInterface {
    void myMethod();
}

特点

  1. 多继承
  2. 多实现
  3. 定规范

成员

  1. 实现接口的类必须实现接口中所有的抽象方法,否则该类也必须声明为抽象类
  2. 接口中的字段都是常量,不能被修改
  3. 默认方法(default)是指在接口中有方法体的普通方法,可以被接口的实现类继承或重写(不是强制)。
  4. 静态方法(static)是指在接口中有方法体的静态方法,只能通过接口的引用访问,因为静态方法不会被继承
  5. 重写了超类Object类中任意一个public方法的方法并不算接口中的抽象方法

注意事项

  1. 接口的主要作用是定义规范和契约,通过接口可以实现组件之间的松耦合
  2. 接口可以继承(extends)多个接口,用逗号分隔
  3. 类可以实现(implements)多个接口,用逗号分隔
  4. 接口中的方法默认使用publicabstract关键字修饰
  5. 当子接口(实现类)的多个父接口中都有相同名称的默认方法,子接口(实现类)必须重写这个默认方法

补充

缩小实现接口(包括抽象类)的方法数量

当只需要实现父接口的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类");
    }
}

为什么接口会有默认方法

解决了接口污染的问题
如果接口扩展了一个抽象方法,但是部分实现类只能进行空实现。
那么这就是接口污染问题,解决方法使用默认方法