zoukankan      html  css  js  c++  java
  • 抽象类

    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
    

  • 相关阅读:
    OpenLayer学习之图文标注
    HTML5制作时钟(canvas)
    ADO,NET中简单三层SQLHelper封装介绍
    OpenLayer学习之加载天地图
    ArcGIS Server manger管理页面无法打开问题解决
    Java EE (14) -- SSH配置
    R语言实战读书笔记(一)R语言介绍
    Machine Learning for hackers读书笔记_一句很重要的话
    Machine Learning for hackers读书笔记(十二)模型比较
    Machine Learning for hackers读书笔记(十)KNN:推荐系统
  • 原文地址:https://www.cnblogs.com/penguin1024/p/11735946.html
Copyright © 2011-2022 走看看