抽象类:
- 在Java中abstract是抽象的意思,可以修饰类、成员方法。
- abstract修饰类,这个类就是抽象类;修饰方法,这个方法就是抽象方法。
注意事项:
- 抽象方法只有方法签名,不能声明方法体。
- 一个类中如果定义了抽象方法,这个类必须声明成抽象类,否则报错。
代码演示如下:
动物类(父类):
public abstract class Animal {
/**
抽象方法:有abstract修饰 不能写方法体代码
*/
public abstract void run();
}
狗狗类(子类):
public class Dog extends Animal {
@Override
public void run() {
System.out.println("狗狗跑的贼快~~");
}
}
测试类:
public class Test { public static void main(String[] args) { //目标:先认识抽象类,再了解它的使用场景。 Dog d = new Dog(); d.run(); } }
抽象的使用场景:
- 抽象类可以理解成不完整的设计图,一般作为父类,让子类来继承。
- 当父类知道子类一定要完成某些行为,但是每个子类该行为的实现又不同,于是该父类就把该行为定义成抽象方法的形式,具体实现交给子类去完成。此时这个类就可以声明成抽象类。
案例
代码演示 如下:
卡的抽象类(父类):
public abstract class Card { private String userName; private double money; /** 定义一个方法:表示卡片可以支付。 抽象方法 */ public abstract void pay(double money); public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public double getMoney() { return money; } public void setMoney(double money) { this.money = money; } }
金卡(子类):
public class GoldCard extends Card{ @Override public void pay(double money2) { System.out.println("您当前的消费是:" + money2); System.out.println("您卡片当前余额是:" + getMoney()); //优惠价: double rs = money2 * 0.8; System.out.println(getUserName() + "您实际支付:" + rs); //更新账户余额 setMoney(getMoney() - rs); } }
测试类:
public class Test { public static void main(String[] args) { //目标:学习抽象类的基本使用:做父类,被继承,重写抽象方法 GoldCard c = new GoldCard(); c.setMoney(10000); c.setUserName("鸟儿"); c.pay(300); System.out.println("剩余:" + c.getMoney()); } }
抽象类的特征和注意事项:
- 类有的成员(成员变量、方法、构造器)抽象类都具备
- 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
- 一个类继承了抽象类必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类
- 不能用abstract修饰变量、代码块、构造器
- 最重要的特征:得到了抽象方法,失去了创建对象的能力(有得有失)
final和abstract是什么关系?
- 互斥关系
- final修饰类,类不能被继承。abstract修饰类,是抽象类,必须要被继承,否则就没有意义
- final修饰方法,方法不能被重写,abstract修饰方法,方法必须要被重写。所以两者是互斥关系。