• 抽象类


    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
    

  • 相关阅读:
    解决:std::ostream operator<< should have been declared inside 'xxx'
    c++ friend 遇到 namespace 无法访问 private 成员的问题
    Compiler Error C2872: ambiguous symbol
    【持续更新】总结:C++开发时积累的一些零碎的东西
    陷阱:C++模块之间的”直接依赖“和”间接依赖“与Makefile的撰写
    ZThread::ThreadLocal:ERROR C4716 must return a value的解决
    java值传递
    iframe与父页面传值
    iframe父子兄弟之间调用传值(contentWindow && parent)
    MySQL返回影响行数的测试示例
  • 原文地址:https://www.cnblogs.com/penguin1024/p/11735946.html
Copyright © 2020-2023  润新知