抽象类和接口

mac2022-06-30  67

抽象类

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

抽象类和抽象方法必须使用 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

最新回复(0)