抽象类
如何定义抽象方法:需要使用一个关键词:abstract
abstract class Person {
public abstract void run();
}
特点:无法实例化抽象类。
Person p = new Person(); // 编译错误
继承了抽象类的子类必须实现所有抽象类中的方法。
接口
如果一个抽象类没有属性只有方法,则可以将其定义为接口。
接口比抽象类还要抽象。因此接口中所有方法都是抽象方法。
如何定义接口:使用关键字interface
interface Person {
void run();
String getName();
}
如何实现接口:使用关键字implements
class Student implements Person {
private String name;
public Student(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println(this.name + " run");
}
@Override
public String getName() {
return this.name;
}
}
一个子类只能有一个父类,但一个类可以实现多个接口。
接口与接口之间的继承:
interface Hello {
void hello();
}
interface Person extends Hello {
void run();
String getName();
}
default关键字:
在接口中,没有关键字修饰的都是抽象方法,都不能实现。
如果要实现接口中的方法,需要用default关键字。
interface Person {
String getName();
default void run() {
System.out.println(getName() + " run");
}
}
实现类可以不必覆写default方法。default方法的目的是,当我们需要给接口新增一个方法时,会涉及到修改全部子类。如果新增的是default方法,那么子类就不必全部修改,只需要在需要覆写的地方去覆写新增方法。
抽象类和接口的区别
- 继承:接口可以实现多个子类。但抽象类只能有一个子类。
- 字段(属性):接口没有属性只有方法。抽象类可以有属性。
- 抽象方法:接口和抽象类中都有抽象方法,且抽象方法不能实现,但在继承的类中需要覆写。
- 非抽象方法:在接口中可以定义default方法,此方法可以进行实现,并且可以不用覆写。在抽象类中可以定义非抽象方法,可以实现,非抽象方法都可以不用覆写。