JAVA接口和类继承的区别

JAVA中接口和继承的区别和接口的应用

一、什么是多态?

父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。

其中编译时多态是静态的 (等式的左边),主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。而运行时多态是动态的 (等式的右边),它是通过动态绑定来实现的,也就是大家通常所说的多态性。

1.1 继承和接口

抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象

接口类似协议,是两个类之间约定的形式,而没有具体实现,实现该接口的类要实现接口中的方法

继承只能单继承,但接口可以“继承”多个接口

1.2 接口实现多态例子

如鼠标、键盘都有USB接口,可以理解为都有USB操作相关的一些操作,可抽象出接口USB

1
2
3
4
5
6
public interface USB {

public void open();
public void close();

}

键盘实现USB接口方法

1
2
3
4
5
6
7
8
9
10
11
12
public class KeyBoard implements USB {

@Override
public void open() {
System.out.println("打开键盘");
}

@Override
public void close() {
System.out.println("关闭键盘");
}
}

鼠标实现USB接口方法

1
2
3
4
5
6
7
8
9
10
11
12
public class Mouse implements USB {

@Override
public void open() {
System.out.println("打开鼠标");
}

@Override
public void close() {
System.out.println("关闭鼠标");
}
}

计算机开关机,调用所有USB相关的设备

1
2
3
4
5
6
7
public void openDevice(USB usb) {
usb.open();
}

public void closeDevice(USB usb) {
usb.close();
}

测试打印

1
2
3
4
5
6
7
开机
打开键盘
打开鼠标
=======
关机
关闭鼠标
关闭键盘


1.3 代理模式

需求接口

1
2
3
4
5
public interface DemandProtocal {

void responseDemand(String iconimage);

}


Engineer 需要 Designer 完成切图,发送切图请求给 Designer,去“触发” Designer 回应切图请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Engineer implements DemandProtocal {

private Designer designer;
public Engineer() {
this.designer = new Designer();
}

public void sendDemand(String demand) {
designer.responseDemand(Engineer.this, demand);
}

@Override
public void responseDemand(String iconimage) {
System.out.println("Engineer -- 得到素材:" + iconimage);
}
}


Designer类收到请求后,将“切图”传回给Engineer

1
2
3
4
5
6
7
8
public class Designer {

public void responseDemand(DemandProtocal callback, String demand) {
System.out.println("Designer -- 收到请求:" + demand);
System.out.println("=============");
callback.responseDemand("切图");
}
}

1.4 对比iOS中TableView的应用

TableView在初始化中要使用数据来填充Cell中的View并依次计算高度,最后根绝高度进行绘制。所以TableView需要一个“代理” 来实现DataSource的具体设置,即DataSouce接口的实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class JSTableview {

private Integer sectioNumber;
private Integer numberOfRowInSection;
private Integer indexpath;

public TableViewDataSource datasource;

public void layout(){

this.sectioNumber = this.delegate.numberOfSectionsInTableView(this);
for (Integer section = 0; section <= sectioNumber; section++) {

System.out.println("当前Section: " + section);
System.out.println("==================");
this.numberOfRowInSection = this.delegate.numberOfRowsInSection(this, section);
for (Integer indexpath = 0; indexpath < numberOfRowInSection; indexpath++) {
Double height = delegate.heightForRowAtIndexpath(this, indexpath);
System.out.println("indexpath: " + indexpath + " -- height: " + height);
}
}
}
}

JSView的实现,将JSTableView的DataSource设置为自己,为TableView的绘制提供数据依据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

public class JSView implements TableViewDataSource {

private JSTableview tableView;

public JSView() {
tableView = new JSTableview();
tableView.datasource = this;
}


//设置section数量
@Override
public Integer numberOfSectionsInTableView(JSTableview tableview) {
return 0;
}

//设置每个section有多少row
@Override
public Integer numberOfRowsInSection(JSTableview tableview, Integer section) {
return 2;
}

//设置row高度
@Override
public Double heightForRowAtIndexpath(JSTableview tableview, Integer indexpath) {

if (indexpath == 0) {
return 44.0;
} else {
return 88.0;
}
}
}

layout中根据View的反馈计算高度,打印结果如下

1
2
3
4
当前Section:0
==================
indexpath: 0 -- height: 44.0
indexpath: 1 -- height: 88.0