更新时间:2020-10-29 17:45:17 来源:极悦 浏览1042次
我们试想一下,假如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接口教程,在求知好学的路上一往无前吧!
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习