Java抽象方法和抽象类

1、抽象方法

        如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类去覆盖它,那么,可以把父类的方法声明为抽象方法

class Person {    
    // 定义抽象方法
    public abstract void run();
}

        把一个方法声明为abstract,表示它是一个抽象方法,本身没有实现任何方法语句。因为这个抽象方法本身是无法执行的,所以Person类无法被实例化。并且编译器会报错无法编译Person类,因为它包含抽象方法。

        必须把Person类本身也声明为abstract,才能正确编译它,如:

// 抽象方法必须定义在抽象类中
  abstract class Person {
     public abstract void run(); 
 }

2、抽象类

        如果一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰。因为无法执行抽象方法,因此这个类也必须申明为抽象类(abstract class)。

        使用abstract修饰的类就是抽象类,抽象类无法实例化。

// 编译报错,Person不能被实例化
Person p = new Person(); 

        抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译会报错。抽象方法实际上相当于定义了"规范"。

abstract class Person {  // 定义抽象类Person
    public abstract void run();   // 抽象方法run()
}


class Student3 extends Person {   // 继承抽象类Person
    @Override
    public void run() {   // 必须覆写父类run()方法,否则会报错
        System.out.println("Student.run");
    }
}

Student p = new Student();
p3.run();       // 运行结果:Student.run

3、面向抽象编程

        定义了抽象类Person,以及具体的Student子类的时候,可以通过抽象类Person类型去引用具体的子类实例。

        这种引用抽象类的好处在于,对其进行方法调用,并不关心Person类型变量的具体子类型。

// Person类型的引用变量s指向Student实例。
Person s = new Student();
s.run();

        这种尽量引用高层类型,避免引用实际子类型的方式,称之为面向抽象编程。

        面向抽象编程本质:

        (1)上层代码只定义规范

        (2)不需要子类就可以实现业务逻辑

        (3)具体的业务逻辑由不同的子类实现,调用者并不关心

4、总结

        通过abstract定义的方法是抽象方法,它只定义没有实现。抽象方法定义了子类必须实现的接口规范。

        定义了抽象方法的class必须被定义为抽象方法,从抽象类继承的子类必须实现抽象方法。

        如果不实现抽象方法,则该子类仍是一个抽象类。

        面向抽象编程使得调用者只关心抽象方法的定义,不关心子类的具体实现。

  • 5
    点赞
  • 10
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:精致技术 设计师:CSDN官方博客 返回首页
评论

打赏作者

AllardZhao

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值