4.9 抽象类与接口的应用
本章目标
? 掌握抽象类及接口的实例化操作 ? 掌握抽象类的实际应用 ? 掌握接口的实际应用
? 掌握抽象类与接口的使用区别 1.为抽象类与接口实例化
在Java中可以通过对象的多态性为抽象类和接口实例化,这样再使用抽象类和接口时即可调用本子类中所覆写过的方法。 范例:为抽象类实例化
abstract class A{ // 定义抽象类A public abstract void print() ; // 定义抽象方法print() }; class B extends A { // 定义子类,继承抽象类 public void print(){ // 覆写抽象方法 System.out.println(\ } }; public class AbstractCaseDemo01{ public static void main(String args[]){ }; } A a = new B() ; a.print() ; // 通过子类为抽象类实例化 程序运行结果:
Hello World!!!
用同样的方法可以为接口进行实例化。 范例:为接口实例化
interface A{ // 定义抽象类A public abstract void print() ; // 定义抽象方法print() }; class B implements A { // 定义子类,继承抽象类 public void print(){ // 覆写抽象方法 System.out.println(\ } }; public class InterfaceCaseDemo01{ public static void main(String args[]){ A a = new B() ; // 通过子类为抽象类实例化 a.print() ; } }; 程序运行结果:
Hello World!!!
从以上的两组代码中可以清楚地发现,程序通过对象的多态性为抽象类及接口进行实例化,这样所调用的方法就是被子类所覆写过的方法。 2.抽象类的实际应用——制订模板
既然可以为抽象类实例化,那么抽象类到底应该如何使用呢?来看下面这样一种场景:假设人分为学生和工人,学生和工人都可以说话,但是学生和工人说话的内容是不一样的,也就是说,说话这个功能应该是一个具体功能,而说话的内容就要由学生或工人来决定了,所以此时就可以使用抽象类实现这种场景,如下图所示。
范例:抽象类的实际应用
abstract class Person{ private String name ; // 定义name属性 private int age ; // 定义age属性 public Person(String name,int age){ this.name = name ; this.age = age ; } public String getName(){ return this.name ; } public int getAge(){ return this.age ; } public void say(){ // 人说话是一个具体的功能 System.out.println(this.getContent()) ; // 输出内容 } public abstract String getContent() ; // 说话的内容由子类决定 }; class Student extends Person{ private float score ; public Student(String name,int age,float score){ super(name,age) ; // 调用父类中的构造方法 this.score = score ; } public String getContent(){ return \学生信息 --> 姓名:\ \;年龄:\ \;成绩:\ } }; class Worker extends Person{ private float salary ; public Worker(String name,int age,float salary){ };
super(name,age) ; // 调用父类中的构造方法 this.salary = salary ; } public String getContent(){ return \工人信息 --> 姓名:\ \;年龄:\ \;工资:\ }
public class AbstractCaseDemo02{ public static void main(String args[]){ }; } Person per1 = null ; // 声明Person对象 Person per2 = null ; // 声明Person对象 per1 = new Student(\张三\ // 学生是一个人 per2 = new Worker(\李四\ // 工人是一个人 per1.say() ; // 学生说学生的话 per2.say() ; // 工人说工人的话 程序运行结果:
学生信息 --> 姓名:张三;年龄:20;成绩:99.0 工人信息 --> 姓名:李四;年龄:30;工资:3000.0
从程序的运行结果中可以发现,在Person类中就相当于定义了一个模板,在主方法中调用时,调用的就是普通方法,而子类只需要实现父类中的抽象方法,就可以取得一个具体的信息。 3.接口的实际应用——制订标准
接口是Java解决多继承局限的一种手段,而且从前面的内容大家也已经清楚可以通过对象多态性为接口进行实例化,但是接口在实际中更多的作用是用来制订标准。例如,U盘和打印机都可以插在计算机上使用,这是因为它们都实现了USB的接口,对于计算机来说,只要是符合了USB接口标准的设备就都可以插上来使用,如下图所示。
范例:制订USB标准
interface USB{ // 定义了USB接口 public void start() ; // USB设备开始工作 public void stop() ; // USB设备结束工作 } class Computer{ public static void plugin(USB usb){ // 电脑上可以插入USB设备 usb.start() ; System.out.println(\设备工作 ========\ usb.stop() ; } }; class Flash implements USB{ public void start(){ // 覆写方法 System.out.println(\盘开始工作。\ } public void stop(){ // 覆写方法 System.out.println(\盘停止工作。\ } }; class Print implements USB{ public void start(){ // 覆写方法 System.out.println(\打印机开始工作。\ } public void stop(){ // 覆写方法 System.out.println(\打印机停止工作。\ } }; public class InterfaceCaseDemo02{ public static void main(String args[]){ Computer.plugin(new Flash()) ; Computer.plugin(new Print()) ; } }; 程序运行结果:
U盘开始工作。
=========== USB 设备工作 ======== U盘停止工作。 打印机开始工作。
=========== USB 设备工作 ======== 打印机停止工作。
4.9 抽象类与接口的应用



