1.抽象类
- abstract修饰的类就是抽象类,abstract修饰的方法就是抽象方法。
- 在Java中abstract是抽象的意思,可以修饰类、成员方法。
- 抽象方法只有方法的特征,没有方法的实现,即不能有方法体。
- 如果父类知道子类一定要做这件事,但是每个子类做的不一样,父类可以声明抽象方法,交给子类重写来实现,这个类就是抽象类了。
- 一个类中如果定义了抽象方法,这个类必须声明成抽象类,否则报错。
- 抽象类的基本作用:作为父类,用来被继承的。
- 一个类如果继承了抽象类,那么这个类必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。
package com.gch.d6_abstract;
public class Test {
public static void main(String[] args) {
Dog d = new Dog();
d.run();
}
}
abstract class Animal{
private String name;
public abstract void run();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Dog extends Animal{
@Override
public void run() {
System.out.println("狗跑的很快");
}
}
2.抽象类的特征和注意事项
- 类有的东西,抽象类都有(成员变量、构造器、方法)
- 抽象类中可以没有抽象方法,但是有抽象方法的类必须是抽象类。
- 一个类如果继承了抽象类,那么这个类必须重写抽象类中的全部抽象方法,否则这个类也必须定义成抽象类。
- abstract只能修饰类和方法,不能用abstract修饰变量、代码块、构造器。
- 抽象类得到了抽象方法,失去了创建对象的能力(有得有失)
- 抽象类不能创建对象,不能实例化!
- 为什么?反证法:假如抽象类可以创建对象,拿着这个对象去调用抽象方法,连方法体都没有,怎么可能运行呢?
package com.gch.d8_abstract_attention;
public class Test {
public static void main(String[] args) {
}
}
abstract class Cat extends Animal{
@Override
public void run() {
}
}
abstract class Animal{
public abstract void run();
public abstract void eat();
}
- final和abstract是互斥关系,不能同时出现。
- abstract定义的抽象类作为模板让子类继承,final定义的类不能被继承。
- abstract修饰的抽象方法定义通用功能让子类重写,final定义的方法不能被重写。
3.案例

package com.gch.d7_abstract_test;
public abstract class Card {
private String name;
private double money;
public abstract void pay(double spendMoney);
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
}
package com.gch.d7_abstract_test;
public class GoldCard extends Card{
@Override
public void pay(double spendMoney){
System.out.println("您当前消费金额为:" + spendMoney);
System.out.println("您卡片当前余额:" + getMoney());
double rs = spendMoney * 0.8;
System.out.println(getName() + ":您实际支付:" + rs);
setMoney(getMoney() - rs);
System.out.println("支付完还剩余额:" + getMoney());
}
}
package com.gch.d7_abstract_test;
public class Test {
public static void main(String[] args) {
GoldCard g = new GoldCard();
g.setMoney(8999);
g.setName("小李");
g.pay(280);
}
}
