抽象类模板,约束着子类必须有且需要重写的方法:
abstract class Beverage {
// 模板方法(定义算法流程)
public final void prepare() {
// final 防止子类修改流程
boilWater();
brew();
pourInCup();
addCondiments();
}
// 公共步骤
private void boilWater() {
System.out.println("烧开水");
}
private void pourInCup() {
System.out.println("倒入杯子");
}
// 抽象步骤(子类必须实现)
protected abstract void brew();
protected abstract void addCondiments();
}
冲咖啡奶茶类(子类):
class Coffee extends Beverage {
@Override
protected void brew() {
System.out.println("冲泡咖啡粉");
}
@Override
protected void addCondiments() {
System.out.println("加糖和牛奶");
}
}
冲茶叶类(子类):
class Tea extends Beverage {
@Override
protected void brew() {
System.out.println("浸泡茶叶");
}
@Override
protected void addCondiments() {
System.out.println("加柠檬");
}
}
需要注意的事项:
- 抽象类的实现很简单,只需要用abstract修饰类名即可。
- abstract修饰的方法是抽象方法,但是抽象方法只能存在于抽象类中。
- 抽象方法不写具体实现代码,留给子类按具体需要重写。
- 继承抽象类的子类也可以本身是抽象类,留给子类的子类重写抽象方法。
- abstract抽象类一般用于约束类的模板,提升写代码效率。
接口
接口和抽象类有点相似,但是接口是纯粹的约束,并且也解决了抽象类子类只能单继承的缺点。接口的实现类可以“继承”多个接口(implements A,B),在子类中重写接口中的方法。
接口的实例:(不是class关键字的类,而是interface关键字的接口)
package com.demo5;
public interface UserService {
void add();
void del();
void renew();
void get();
}
在接口中的方法可以简写,默认是(public abstract)修饰
在接口中的属性,默认是(public static final)修饰
总结:面向接口编程是很重要的抽象思想。
接口的实例化采用多态的方式实现,例如
Jumping a = new Cat();
接口用interface修饰
接口的实现类用implements继承
接口的实例化可以用多态的方式,父类引用指向子类
169

被折叠的 条评论
为什么被折叠?



