1.先定义一个AbstractPerson抽象类
public abstract class AbstractDad { private int cnt; public abstract void show(); // 自定义抽象方法 public void print() { // 普通方法 System.out.println("我是AbstractPerson抽象类中自定义的普通方法"); } public AbstractDad() { // 无参构造 super(); } public AbstractDad(int cnt) { // 有参构造 super(); setCnt(cnt); } public int getCnt() { return cnt; } public void setCnt(int cnt) { this.cnt = cnt; } }
2.测试类:
package com.monkey1026; public class Test { public static void main(String[] args) { //AbstractDad ap = new AbstractDad (66); //编译报错:抽象类不能实例化对象 } }
归纳:
观察代码可知:
抽象类的定义:class前 加 abstract 关键字修饰 ,其中阿里巴巴开发手册规定 : 抽象类的命名使用Abstract或Base开头
抽象类中可以没有抽象方法,但是一个类中只要存在了抽象方法,则该类必须声明为抽象类,否则报错。
抽象类中有构造方法。
抽象方法的定义:抽象方法没有方法体,抽象方法 必须有 abstract 关键字修饰
//AbstractDad ap = new AbstractDad (66); //编译报错:抽象类不能实例化对象
抽象类不能实例化对象
写个Sub子类 继承 Dad抽象类
public class Sub extends AbstractDad { @Override public void show() { System.out.println("我是被迫重写的show()方法,不重写则报错"); } }
测试类:
public class Test { public static void main(String[] args) { AbstractDad ad= new Sub(); // 形成多态 ad.show(); } }
结果:
我是被迫重写的show()方法,不重写则报错
抽象类可以作为父类:一个子类继承了一个抽象类。则自动重写抽象类中所有的抽象方法。必须重写,且不能删除。(强制性)
运行阶段依旧是执行 子类重写之后的方法。
思考问题: 既然抽象类本身不能new构造出自己的对象,那抽象类中允许存在构造方法的意义何在?
因为抽象类可以作为子类的父类,子类在构造子类对象时,会去调用父类的构造方法。若抽象父类不允许有构造方法存在,那么子类也构造不了对象了。
案例:计算利息
1.定义 一个AbstractAccount 账户抽象类
// 账户类(抽象类) public abstract class AbstractAccount { private double money = 1000.0; public AbstractAccount() { super(); } public AbstractAccount(double money) { super(); setMoney(money); } public double getMoney() { // 获取本金 return money; } public void setMoney(double money) { this.money = money; } // 自定义 抽象方法 用于描述 利息的计算 public abstract double getInterest (); }
2.定义一个FixedAccount 定期账户类
// 定期账户 public class FixedAccount extends AbstractAccount { @Override public double getInterest() { // 自动重写了AbstractAccount类中的getInterest()抽象方法 return getMoney()*0.003; } }
3.测试类
public class Test { public static void main(String[] args) { AbstractAccount aa= new FixedAccount();
double res = aa.getInterest(); // 获取利息
System.out.println("利息:"+res); } }
控制台结果:
利息:3.0