抽象类
拥有抽象方法的类叫抽象类;只定义方法签名,没有方法体的方法叫抽象方法。
-
抽象类和抽象方法必须使用 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
}
}
注意:
- 一个接口可以继承多个接口;
- 一个类可以实现多个接口。