尚硅谷JavaSE基础

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( )  {  //写出计算驳船行驶距离的具体方法}

}

 

 

 

注意:抽象类不能实例化   new Vihicle()是非法的