抽象类和接口

抽象类

拥有抽象方法的类叫抽象类;只定义方法签名,没有方法体的方法叫抽象方法。

  • 抽象类和抽象方法必须使用 abstract 修饰符来定义,抽象方法不能有方法体,只有方法签名。

  • 有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法。

  • 抽象类不能被实例化,其构造器只能被其子类调用初始化父类数据的。

  • 继承抽象类的子类必须将抽象方法重写,要不然只能将子类也定义为抽象类。

abstract class A {  //抽象类
    protected int x;
    private int y;

    public abstract void f1();  //抽象方法

    public void f2() {  //普通方法
        System.out.println("f2");
    }
}

public class B extends A {
    @Override
    public void f1() {  //子类重写父类抽象方法
        System.out.println("f1");
    }

    public static void main(String[] args) {
        //A a = new A();  //报错
        A a = new B();
        a.f1();  //f1
        a.f2();  //f2
    }
}

注意:

  • abstract 不能和 final 共存,abstract 修饰的类只能被继承,abstract 修饰方法只能被子类重写;而 final 修饰的类不能被继承,final 修饰的方法不能被重写。

  • abstract 和 static 不能同时修饰某个方法,没有所谓的类抽象方法,但他们可以同时修饰内部类。

  • abstract 和 private 不能同时修饰某个方法,因为抽象方法不重写将毫无意义。

  • abstract 不能用于修饰成员变量、局部变量和构造器。



接口

接口是抽象类的延伸,在 JDK 1.8 之前,它可以看成是一个完全抽象的类,所有方法都是抽象方法。 JDK 1.8 开始,接口也可以拥有默认的方法实现。

接口的只定义方法签名的方法一般默认为 public abstract ,默认的方法为 public,属性默认为 public static final

public interface A {  //接口定义用关键字interface
    int a = 123;      //默认public static final

    void func1();     //默认public abstract

    default void func2() {  //默认方法,需要加default
        System.out.println("func2");
    }
}
public class B implements A { //接口实现用关键词implements
    @Override
    public void func1() {  //重写抽象方法
        System.out.println("func1");
    }

    public static void main(String[] args) {
        //A a = new A();  //报错
        A a = new B();
        a.func1();  //func1
        a.func2();  //func2
    }
}

注意:

  • 一个接口可以继承多个接口;
  • 一个类可以实现多个接口。
原文地址:https://www.cnblogs.com/zongmin/p/11341222.html