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 Student extends Person {   // 继承抽象类Person
    @Override
    public void run() {   // 必须覆写父类run()方法,否则会报错
        System.out.println("Student.run");
    }
}
 
Student p = new Student();
p.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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值