java抽象方法怎么写,java中的抽象方法
墨初 知识笔记 128阅读
文章目录 1. 相关概念2. 如何定义抽象方法和抽象类3. 抽象类的作用4. 练习题4.1. 问题14.2. 问题2
1. 相关概念

抽象类随着继承层次中一个个新子类的定义类变得越来越具体而父类则更一般更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象以至于它没有具体的实例这样的类叫做抽象类。
2. 如何定义抽象方法和抽象类abstract关键字
1用 abstract 关键字
来修饰一个类时这个类叫做抽象类
2用 abstract关键字
来修饰一个方法时该方法叫做抽象方法。

抽象方法
只有方法的声明没有方法的实现。以分号结束如
abstract int abstractMethod(int a);
注意
①含有抽象方法的类必须被声明为抽象类。
②抽象类不能被实例化。抽象类是用来作为父类被继承的抽象类的子类必须重写父类的抽象方法并提供方法体。若没有重写全部的抽象方法仍为抽象类。
③不能用 abstract
修饰属性、私有方法、构造器、静态方法、 final 的方法。
举例
编程实现父类为Animal类且为抽象类子类有Dog、Fish、Bird类
答
Animal类
package day09;public abstract class Animal {//定义父类Animal因为类中含抽象方法所以必须声明为抽象类public abstract void test();//只要类中有一个抽象方法类就必须是一个抽象类public abstract void move();}//定义子类Dog、Fish、Bird(抽象类)//子类Dogclass Dog extends Animal{Overridepublic void test() {}Overridepublic void move() {System.out.println(狗的移动方式是跑);}}//子类Fishclass Fish extends Animal{Overridepublic void test() {}Overridepublic void move() {System.out.println(鱼的移动方式是游);}}//抽象子类Bird抽象类可以继承抽象类abstract class Bird extends Animal{//因为该类中没有重写test()方法test()仍为抽象方法所以Bird必须是抽象类Overridepublic void move() {System.out.println(鸟的移动方式是飞);}public abstract void test();//只要类中有一个抽象方法类就必须是一个抽象类}
Test.java
package day09;public class Test {public static void main(String[] args) {Dog d new Dog();Fish f new Fish();//Bird b new Bird();//抽象类不能被实例化d.move();f.move();}}
运行结果
小结抽象类是用来模型化那些父类无法确定全部实现而是由其子类提供具体实现的对象的类。
4. 练习题 4.1. 问题1问题情境
在航运公司系统中Vehicle 类需要定义两个方法分别计算运输工具的燃料效率和行驶距离。
问题卡车 (Truck) 和驳船 (RiverBarge) 的燃料效率和行驶距离的计算方法完全不同。 Vehicle类不能提供计算方法但子类可以。该如何实现
答案
// Vehicle 是一个抽象类有两个抽象方法。public abstract class Vehicle{public abstract double calcFuelEfficiency(); // 计算燃料效率的抽象方法public abstract double calcTripDistance(); // 计算行驶距离的抽象方法}//Truck子类public class Truck extends Vehicle{public double calcFuelEfficiency( ) { // 写出计算卡车的燃料效率的具体方法 }public double calcTripDistance( ) { // 写出计算卡车行驶距离的具体方法 }}//RiverBarge子类public class RiverBarge extends Vehicle{public double calcFuelEfficiency( ) { // 写出计算驳船的燃料效率的具体方法}public double calcTripDistance( ) { // 写出计算驳船行驶距离的具体方法 }}
思考题
问题 1 为什么抽象类不可以使用 final 关键字声明
答抽象类不能被实例化。抽象类是用来被继承的抽象类的子类必须重写父类的抽象方法 并提供方法体
问题 2 一个抽象类中可以定义构造器吗
答抽象类可以有构造方法只是不能直接创建抽象类的实例对象而已
抽象类不能实例化new 抽象类()
是非法的。
编写一个 Employee 类声明为抽象类包含如下三个属性 name id salary 。提供必要的构造器和抽象方法 work() 。对于 Manager类来说他既是员工还具有奖金 (bonus) 的属性。请使用继承的思想设计 CommonEmployee 类和 Manager 类要求类中提供必要的方法进行属性访问。
答案
Employee类
package day09;//抽象类Employee父类public abstract class Employee {public Employee() {}int id;String name;double salary;public abstract void work();}//子类普通员工class CommonEmployee extends Employee{public void setCommonEmployeeInfo(int id, String name, double salary) {super.id id;super.name name;super.salary salary;}public void getCommonEmployeeInfo() {System.out.println(super.id);System.out.println(super.name);System.out.println(super.salary);}Overridepublic void work() {System.out.println(这是一个普通的员工);}}//子类领导class Manager extends Employee{double bonus;public void setMangerInfo(int id, String name, double salary,double bonus) {super.id id;super.name name;super.salary salary;this.bonus bonus;}public void getMangerInfo() {System.out.println(super.id);System.out.println(super.name);System.out.println(super.salary);System.out.println(this.bonus);}Overridepublic void work() {System.out.println(这是领导);}}
Test.java
package day09;public class Test {public static void main(String[] args) {//普通员工CommonEmployee ce new CommonEmployee();ce.work();ce.setCommonEmployeeInfo(123, 员工张, 6000.00);ce.getCommonEmployeeInfo();System.out.println(---------------------------);//领导Manager me new Manager();me.work();me.setMangerInfo(111, 领导李, 12000.00, 2000.00);me.getMangerInfo();}}
运行结果