7.6 抽象类
7.6.1 抽象类概念
1.抽象类(abstract class)
随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类就可以声明为抽象类。
2. 抽象类和具体类
抽象类与具体类
具体类 — 对现实世界一种实体的抽象定义。
抽象类 — 对现实世界一种类型的多种实体的统一抽象定义。
例如:
Pet类应定义为抽象类
Bird类应定义为具体类
抽象类中可声明抽象方法
示例:
public abstract class Pet {
public abstract void speak();
……
}
7.6.2特点
①用abstract关键字来修饰一个类时,这个类叫做抽象类;
②用abstract来修饰一个方法时,该方法叫做抽象方法。
抽象方法:只有方法的声明,没有方法的实现。以分号结束:abstract int abstractMethod( int a );
含有抽象方法的类必须被声明为抽象类。
抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍为抽象类。
不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法。
7.6.3抽象类使用
public abstract class Pet { private String name; private int age; private int weight;
public Pet(String name, int age, int weight) { this.name = name; this.age = age; this.weight = weight; } public String getName() { return name; } public void setName(String name) { this.name = name; }
public abstract void speak(); // 抽象方法,仅有方法签名没有方法体,因此不能执行
public abstract void eat();
} |
public class Bird extends Pet { private int flySpeed;
public Bird(String name, int age, int weight, int flySpeed) { super(name, age, weight); this. flySpeed = flySpeed; }
public int getFlySpeed() { return flySpeed; } public void speak() { System.out.println("布谷布谷..."); } public void eat() { System.out.println("Eating..."); } } |
public class TestAbstract { public static void main(String args[]) { Pet pet = new Bird("小布", 1, 100, 20); // 抽象类适用于多态 pet.speak(); // 虚拟方法调用, 执行子类方法, 父类方法是抽象的, 无法执行 } } |
7.6.4 使用场景
解决方案:
Java允许类设计者指定:超类声明一个方法但不提供实现,该方法的实现由子类提供。这样的方法称为抽象方法。有一个或更多抽象方法的类称为抽象类。
Vehicle是一个抽象类,有两个抽象方法。
public abstract class Vehicle{ public abstract double calcFuelEfficiency(); //计算燃料效率的抽象方法 public abstract double calcTripDistance(); //计算行驶距离的抽象方法 } public class Truck extends Vehicle{ public double calcFuelEfficiency( ) { //写出计算卡车的燃料效率的具体方法 } public double calcTripDistance( ) { //写出计算卡车行驶距离的具体方法 } } public class RiverBarge extends Vehicle{ public double calcFuelEfficiency( ) { //写出计算驳船的燃料效率的具体方法 } public double calcTripDistance( ) { //写出计算驳船行驶距离的具体方法} }
|
本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。