abstract用于定义抽象类,抽象类表示没有具体的实现方法。
下面举一个例子:(源码来自菜鸟教程)
1 package work_station; 2 3 public class Test { 4 public static void main(String[] args) { 5 show(new Cat()); // 以 Cat 对象调用 show 方法 6 show(new Dog()); // 以 Dog 对象调用 show 方法 7 8 Animal a = new Cat(); // 向上转型 9 a.eat(); // 调用的是 Cat 的 eat10 Cat c = (Cat)a; // 向下转型 11 c.work(); // 调用的是 Cat 的 work12 } 13 14 public static void show(Animal a) {15 a.eat();16 // 由于没有对work进行抽象定义,所以此处要进行类型判断17 if (a instanceof Cat) { // 猫做的事情 18 Cat c = (Cat)a; 19 c.work(); 20 } else if (a instanceof Dog) { // 狗做的事情 21 Dog c = (Dog)a; 22 c.work(); 23 } 24 } 25 }26 27 abstract class Animal { //抽象定义,只有抽象方法的定义没有,没有实现方式28 abstract void eat(); //此时没有对work进行抽象定义29 } 30 31 class Cat extends Animal { 32 public void eat() { 33 System.out.println("吃鱼"); 34 } 35 public void work() { 36 System.out.println("抓老鼠"); 37 } 38 } 39 40 class Dog extends Animal { 41 public void eat() { 42 System.out.println("吃骨头"); 43 } 44 public void work() { 45 System.out.println("看家"); 46 } 47 }
下面对work进行抽象定义。
1 package work_station; 2 3 public class Test { 4 public static void main(String[] args) { 5 show(new Cat()); // 以 Cat 对象调用 show 方法 6 show(new Dog()); // 以 Dog 对象调用 show 方法 7 8 Animal a = new Cat(); // 向上转型 9 a.eat(); // 调用的是 Cat 的 eat10 Cat c = (Cat)a; // 向下转型 11 c.work(); // 调用的是 Cat 的 work12 } 13 14 public static void show(Animal a) {15 a.eat();16 a.work(); //直接对work进行调用17 // // 类型判断18 // if (a instanceof Cat) { // 猫做的事情 19 // Cat c = (Cat)a; 20 // c.work(); 21 // } else if (a instanceof Dog) { // 狗做的事情 22 // Dog c = (Dog)a; 23 // c.work(); 24 // } 25 } 26 }27 28 abstract class Animal { //抽象定义,只有抽象方法的定义没有,没有实现方式29 abstract void eat(); 30 abstract void work();31 } 32 33 class Cat extends Animal { 34 public void eat() { 35 System.out.println("吃鱼"); 36 } 37 public void work() { 38 System.out.println("抓老鼠"); 39 } 40 } 41 42 class Dog extends Animal { 43 public void eat() { 44 System.out.println("吃骨头"); 45 } 46 public void work() { 47 System.out.println("看家"); 48 } 49 }