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必须被定义为抽象方法,从抽象类继承的子类必须实现抽象方法。
如果不实现抽象方法,则该子类仍是一个抽象类。
面向抽象编程使得调用者只关心抽象方法的定义,不关心子类的具体实现。
今天的文章java抽象方法和抽象类的区别_子类能继承父类的所有方法和属性分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/78562.html