抽象类

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 关键字修饰  ,其中阿里巴巴开发手册规定 : 抽象类的命名使用AbstractBase开头

抽象类中可以没有抽象方法,但是一个类中只要存在了抽象方法,则该类必须声明为抽象类,否则报错。

抽象类中有构造方法。

抽象方法的定义:抽象方法没有方法体,抽象方法 必须有 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

 


 

posted @ 2019-10-25 01:12  小茅棚  阅读(229)  评论(0编辑  收藏  举报