面向对象——抽象类

前言

        前面,我们学习了面向对象的三大特征,其中多态的使用需要有子类重写父类的方法。今天,我们介绍学习一个与继承相关的知识——抽象类(abstract)。

正文

一、抽象类关键字

        abstract,抽象类的关键字,意思是抽象的。可以用于修饰成员方法、类。

abstract class Fu {//abstract可以修饰类
    abstract int a = 10;//java: 此处不允许使用修饰符abstract
    public abstract void run();//abstract可以修饰方法.
}
二、抽象类的注意事项
  1. 抽象类不一定有抽象方法,抽象方法一定在抽象类中。

    abstract class Fu {
    }//abstract修饰类可以没有抽象方法.
    //错误示范
    class Fu {
        public abstract void run();
    }
    //java: Test02.Fu不是抽象的, 并且未覆盖Test02.Fu中的抽象方法run()
    //正确示范
    abstract class Fu {
        public abstract void run();
    }abstract修饰的方法一定要在抽象类中.

  2. 抽象类中,可以修饰具体的方法,成员变量,构造器。

    abstract class Fu {
        private String name;//具体的成员变量
    ​
        public Fu(String name) {
            this.name = name;
        }//构造器
    ​
        public String getName() {
            return name;
        }//具体的方法
    ​
        public void setName(String name) {
            this.name = name;
        }
    }

  3. 抽象类不可以创建对象。

    class Test {
        public static void main(String[] args) {
            Fu fu =new Fu();
        }//java: Test02.Fu是抽象的; 无法实例化
    }

    但是,抽象类可以用于多态。

    class Test {
        public static void main(String[] args) {
            Fu fu =new Zi();
        }
    }
    abstract class Fu {
    }
    class Zi extends Fu {
        
    }

  4. 子类继承抽象类父类后,可以选择将父类所有的抽象方法重写或者将子类定义为抽象类。

    abstract class Fu {
        abstract void run();
    }
    class Zi extends Fu {
        @Override
        void run() {
            System.out.println("跑");
        }//实现抽象方法
    }
    abstract class Fu {
        abstract void run();
    }
    abstract class Zi extends Fu {
    }//定义为抽象类

三、模板方法的设计

        模板方法,是20多种设计的一种。需要用到抽象方法。

  1. 使用场景:多个方法中大部分的内容是重复的情况下,我们可以考虑使用模板实际。

  2. 使用方法,将相同的代码成分提取出来,创建一个方法用来存放相同的代码,并放入抽象方法来取代不同的代码部分。

  3. 标准格式:

    • 抽象方法

    • 模板方法

    abstract class A {
        abstract void a();//抽象方法
    ​
        public void run(){//模板方法
            System.out.println("代码的相同部分");
            a();
            System.out.println("代码的相同部分");
        }
    }  

  4. 因为模板设计一旦被子类重写就毫无意义,所以为了防止模板方法在子类继承时被重写,我们可以在模板方法上定义一个final。

    abstract class A {
        abstract void a();
    ​
        public final void run(){
            System.out.println("代码的相同部分");
            a();
            System.out.println("代码的相同部分");
        }//final 修饰,无法继承修改。
    }  

  5. 模板方法的好处:解决了代码的重复部分,简化了代码的运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值