一、抽象类(abstract)
如果一个class
定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract
修饰。
因为无法执行抽象方法,因此这个类也必须申明为抽象类
- 使用
abstract
修饰的类就是抽象类。我们无法实例化一个抽象类 - 抽象类定义了抽象方法,那么,在继承它的子类,就必须覆写
run()
方法 - 抽象类中只定义规范,没有具体逻辑,具体的业务逻辑由不同的子类实现
- 抽象类可以含有抽象方法,也可以不包含抽象方法,抽象类中可以有具体的方法
public class Main {
public static void main(String[] args) {
Person p = new Student();
p.run();
}
}
// Person为抽象类,只是规定了规范
abstract class Person {
// 抽象方法,没有函数体,不会执行,只是一个规范,子类必须对其进行重写
public abstract void run();
}
class Student extends Person {
// 继承抽象类,必须重写其抽象方法
@Override
public void run() {
System.out.println("Student.run");
}
}
二、接口(interface)
接口是一个特殊的抽象类。接口的所有方法全部都是抽象方法,没有方法体
1、接口使用interface修饰,使用implements来调用接口
2、接口不能被实例化
3、一个类只能继承一个类,但是可以实现多个接口
4、接口中方法均为抽象方法;接口中可以有变量,但是要被初始化,用 public final 修饰
5、接口中不能包含实例域或静态方法(静态方法必须实现,接口中方法是抽象方法,不能实现)
6、一个接口不能继承其它的类,但是可以继承别的接口
interface Person{
// 在接口中 public final 和 public abstract 可以省略
// 接口中的变量必须定用final修饰,即常量
(public final) int a = 1;
String b = "aaa"; // 变量一旦赋值就不可更改,为final修饰,final可以省略
(public abstract) void setName();
}
public class Student implements Person{
public void setName(){
...
}
}
- 一个
interface
可以继承自另一个interface
interface Hello {
void hello();
}
interface Person extends Hello {
void run();
String getName();
}