关于java接口与多态、继承的思考

来源:互联网 发布:图像分析软件 编辑:程序博客网 时间:2024/05/20 22:40

Java 的接口可以想象成为c++的抽象类, 是java实现多态的一种方法

如果有个类拥有一个接口, 那么这个类就是接口的子类, 即接口是这个类的父类;

如下例

interface PCI{public abstract void start();public abstract void stop();}class GraphicCard implements PCI{private String model;public GraphicCard(String mod) {model = mod;}public void start() {System.out.println("GraphicCard is working");}public void stop() {System.out.println("GraphicCard is stopping");}}class NetworkCard implements PCI{private String model;public NetworkCard(String mod) {model = mod;}public void start() {System.out.println("NetworkCard is working");}public void stop() {System.out.println("NetworkCard is stopping");}}
那么GraphicCard、NetworkCard实际上就是PCI接口(类)的子类,如果你学过c++那么这段代码等效于

class PCI{virtual  void start();virtual  void stop();};class GraphicCard: public PCI{private:    String model;public:    GraphicCard(String mod) {model = mod;}    void start() {System.out.println("GraphicCard is working");}void stop() {System.out.println("GraphicCard is stopping");}};class NetworkCard : public PCI{private:    String model;public:    NetworkCard(String mod) {model = mod;}    void start() {System.out.println("NetworkCard is working");}    void stop() {System.out.println("NetworkCard is stopping");}};

c++有些知识忘了, 大体意思如此,或许有疑问,有继承了为啥还要接口,这个问题待会再说;

理解了这步以后以后让我们看下例

主板类例

一个主板可能只有一个插槽, 插槽上可以插网卡、显卡等, 但是怎么实现呢?

package com.abc;interface PCI{public abstract void start();public abstract void stop();}class GraphicCard implements PCI{private String model;public GraphicCard(String mod) {model = mod;}public void start() {System.out.println("GraphicCard is working");}public void stop() {System.out.println("GraphicCard is stopping");}}class NetworkCard implements PCI{private String model;public NetworkCard(String mod) {model = mod;}public void start() {System.out.println("NetworkCard is working");}public void stop() {System.out.println("NetworkCard is stopping");}}/* *   可以定义一系列可以插了主板的卡片..... */class MainBoard{private String model;private PCI slot1; // 实现多态的条件public MainBoard(String mod, PCI card) {model = mod;slot1 = card;}public void setSlot1(PCI card) {this.slot1 = card;}public void work() {slot1.start();}}public class TestMainBorad {public static void main(String[] args) {NetworkCard Nc = new NetworkCard("网卡");GraphicCard Gc = new GraphicCard("显卡");//初始化主板插槽放置显卡MainBoard M1 = new MainBoard("主板", Gc);//显卡开始工作M1.work();//更换主板插槽所放卡片类型M1.setSlot1(Nc);//网卡开始工作M1.work();}}
这样你就应该理解接口类型sloat1为什么赋值成NetworkCard 、GraphicCard等类了(即上将接口看做c++中的类 ),这样主板上无论插上显卡还是网卡都能工作了。

至于为什么要有接口,因为Java只允许单继承, 却允许有多个接口, 如上例,NetworkCard如果能够插了手机上(假设), 那么NetworkCard需要继承手机的PCIForMobile类,

然而Java不允许多继承,只好用接口代替。

原创粉丝点击