JAVA中接口和继承的区别和接口的应用
一、什么是多态?
父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。
其中编译时多态是静态的 (等式的左边),主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。而运行时多态是动态的 (等式的右边),它是通过动态绑定来实现的,也就是大家通常所说的多态性。
1.1 继承和接口
抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象
接口类似协议,是两个类之间约定的形式,而没有具体实现,实现该接口的类要实现接口中的方法
继承只能单继承,但接口可以“继承”多个接口
1.2 接口实现多态例子
如鼠标、键盘都有USB接口,可以理解为都有USB操作相关的一些操作,可抽象出接口USB1
2
3
4
5
6public interface USB {
public void open();
public void close();
}
键盘实现USB接口方法1
2
3
4
5
6
7
8
9
10
11
12public class KeyBoard implements USB {
public void open() {
System.out.println("打开键盘");
}
public void close() {
System.out.println("关闭键盘");
}
}
鼠标实现USB接口方法
1 | public class Mouse implements USB { |
计算机开关机,调用所有USB相关的设备1
2
3
4
5
6
7public 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
5public 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
16public class Engineer implements DemandProtocal {
private Designer designer;
public Engineer() {
this.designer = new Designer();
}
public void sendDemand(String demand) {
designer.responseDemand(Engineer.this, demand);
}
public void responseDemand(String iconimage) {
System.out.println("Engineer -- 得到素材:" + iconimage);
}
}
Designer类收到请求后,将“切图”传回给Engineer1
2
3
4
5
6
7
8public 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 | public class JSTableview { |
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数量
public Integer numberOfSectionsInTableView(JSTableview tableview) {
return 0;
}
//设置每个section有多少row
public Integer numberOfRowsInSection(JSTableview tableview, Integer section) {
return 2;
}
//设置row高度
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