专注Java教育14年 全国咨询/投诉热线:444-1124-454
星辉LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 实例探究Java接口存在意义

实例探究Java接口存在意义

更新时间:2020-10-29 17:45:17 来源:星辉 浏览978次

我们试想一下,假如Java中没有接口会怎么样呢?一个类总归是可以通过继承来进行扩展的,这难道不足以我们的实际应用吗?本文我们就来用实例一起来探究Java接口存在的意义


首先,我们要知道一个对象需要知道其他的一些对象,并且与其他的对象发生相互的作用,这是因为这些对象需要借住于其他对象的行为以便于完成一项工作。这些关于其他对象的知识,以及对其他对象行为的调用,都是使用硬代码写在类里面的,可插入性几乎为0。如:钢笔中需要钢笔水,钢笔水有不同的颜色:钢笔水类:

package com.glmapper.demo.base;

/**

* 钢笔墨水

* @author glmapper

*/

public class PenInk {

//墨水颜色

private String inkColor;

public String getInkColor() {

return inkColor;

}

public void setInkColor(String inkColor) {

this.inkColor = inkColor;

}

public PenInk(String inkColor) {

super();

this.inkColor = inkColor;

}

}

钢笔中持有一个墨水类的对象引用:

package com.glmapper.demo.base;

/**

* 钢笔类 继承父类 笔

* @author 17070738

*

*/

public class Fountainpen extends Pen{

//引用持有

PenInk ink =new PenInk("black");

@Override

public void write(String cnt) {

System.out.println("钢笔墨水颜色是:"+ink.getInkColor());

System.out.println("这是一支钢笔写的内容,内容是:"+cnt);

}

}


但是这种时候,我们需要换一种颜色怎么办呢?就必须要对Fountainpen中的代码进行修改,将创建PenInk对象时的inkColor属性进行更改;现在假如我们有一个具体的类,提供某种使用硬代码写在类中的行为;现在,要提供一些类似的行为,并且可以实现动态的可插入,也就是说,要能够动态的决定使用哪一种实现。一种方案就是为这个类提供一个抽象父类,且声明出子类要提供的行为,然后让这个具体类继承自这个抽象父类。同时,为这个抽象父类提供另外一个具体的子类,这个子类以不同的方法实现了父类所声明的行为。客户端可以动态的决定使用哪一个具体的子类,这是否可以提供可插入性呢?改进之后的代码:子类1:黑色墨水

package com.glmapper.demo.base;

/**

* 黑色墨水

* @author glmapper

*/

public class BlackInk extends PenInk{

public BlackInk() {

super("black");

}

}

子类2:蓝色墨水

package com.glmapper.demo.base;

/**

* 蓝色墨水

* @author glmapper

*/

public class BlueInk extends PenInk{

public BlueInk() {

super("blue");

}

}

钢笔类引用:

package com.glmapper.demo.base;

/**

* 钢笔类 继承父类 笔

* @author 17070738

*

*/

public class Fountainpen extends Pen{

PenInk ink ;

//通过构造函数初始化PenInk ,PenInk由具体子类来实现

public Fountainpen(PenInk ink) {

this.ink = ink;

}

@Override

public void write(String cnt) {

System.out.println("钢笔墨水颜色是:"+ink.getInkColor());

System.out.println("这是一支钢笔写的内容,内容是:"+cnt);

}

}

客户端调用:

public static void main(String[] args) {

/**

* 使用黑色墨水子类

*/

Pen pen= new Fountainpen(new BlackInk());

pen.write("我是一支笔");

}


从上面代码可以看出,确实可以在简单的情况下提供了动态可插入性。

但是由于java语言是一个单继承的语言,换言之,一个类只能有一个超类,因此,在很多情况下,这个具体类可能已经有了一个超类,这个时候,要给他加上一个新的超类是不可能的。如果硬要做的话,就只好把这个新的超类加到已有的超类上面,形成超超类的情况,如果这个超超类的位置也已经被占用了,就只好继续向上移动,直到移动到类等级结构的最顶端。这样一来,对一个具体类的可插入性设计,就变成了对整个等级结构中所有类的修改。这种还是假设这些超类是我们可以控制的,如果某些超类是由一些软件商提供的,我们无法修改,怎么办呢?因此,假设没有Java接口,可插入性就没有了保证。


怎么样?看完了本文小伙伴们是不是对Java接口存在意义不再疑惑,事实上,Java语言经过这么长时间的发展,Java里面的每一个机制或者专业术语都有着其独特的意义,我们只有经过不断的学习和探究,才能求得真相。观看本站的Java接口教程,在求知好学的路上一往无前吧!


提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>