抽象与接口
抽象
为了约束代码的实现,可以在 class 之前添加 abstract 使其变成一个抽象类。
抽象类不能实例化对象,所以抽象类必须被继承后才能被使用,且子类必须重写抽象方法。
抽象方法:只包含一个方法名,而没有方法体,使用abstract修饰。
Animal.java
public abstract class Animal {
//抽象类不可以new,但是抽象类有构造方法
public Animal(){
System.out.println("Animal的构造方法执行了");
}
//抽象方法只有方法名字,没有方法体
public abstract void eat();
//抽象类里可以写普通方法
public void sleep(){
System.out.println("动物都需要睡觉");
};
}
Bird.java
public class Bird extends Animal{
public Bird(){
//默认执行了父类的构造方法
System.out.println("Bird的构造方法执行了");
}
@Override
public void eat() {
//继承了抽象类则必须重写抽象方法
System.out.println("鸟需要吃饭");
}
}
Demo.java
public class Demo{
public static void main(String[] args) {
Bird bird = new Bird(); Animal的构造方法执行了
Bird的构造方法执行了
//重写的 eat() 方法
bird.eat(); 鸟需要吃饭
//继承的 sleep() 方法
bird.sleep(); 动物都需要睡觉
}
}
接口
为了约束代码的实现,可以将 class 改为 interface 使其变成一个接口类。
接口类不能实例化对象,所以接口类需要一个实现类去重写接口方法。
实现类需要 implements 接口类。
Animal.java
public interface Animal {
//接口没有构造方法
//接口变量只能是常量,默认为 public abstract final
String name = "WW";
//接口定义的方法都是抽象的,所以接口里不可以写普通方法
//接口方法只有方法名字,没有方法体,且默认为 public abstract
void eat();
}
Bird.java
public class Bird implements Animal{
//接口需要实现类
@Override
public void eat() {
//对接口的方法进行重写
System.out.println("鸟需要吃饭");
}
}
Demo.java
public class Demo{
public static void main(String[] args) {
Bird bird = new Bird();
//重写的 eat() 方法
bird.eat();
}
}
小结
- 抽象类和接口类都是用来约束代码的实现,将方法名定义好,后转接给开发人员去实现。
- 抽象类和接口类都无法通过new来实例化,抽象类需要被子类继承重写方法,而接口需要实现类对接重写方法。
- 抽象类可以有构造方法,但接口类不能有构造方法。
- 一个类只能有一个抽象类(继承关系),但可以有很多个接口类,间接实现多继承。即一个亲爹和很多个干爹的概念。
- 抽象类和接口类都能有效规范程序的编写,提高开发效率。但由于接口可以实现多继承,在工作中使用更加频繁。
抽象与接口综合例子
//警报门,可以开和关,还可以发出警报
public class AlarmDoor extends Door implements Alram{
//重写抽象类Door
@Override
void open() {}
@Override
void close() {}
//重写接口类Alam
@Override
public void alarm() {}
}
//抽象门,具有开和关的功能
abstract class Door {
abstract void open();
abstract void close();
}
//接口报警器,具有发出警报的功能
interface Alram {
void alarm();
}