首页 / JAVA / Java面向对象(三)
Java面向对象(三)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java面向对象(三),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6127字,纯文字阅读大概需要9分钟。
内容图文
文章目录
1、接口
1.1、概述
抽象类是从多个类中抽象出来的模板,如果将这种抽象进行得更彻底,则可以提炼出一种更加特殊的“抽象类”——接口(inteface)。
Java 9对接口进行了改进,允许在接口中定义默认方法和类方法,默认方法和类方法都可以提供方法实现,Java 9为接口增加了一种私有方法,私有方法也可提供方法实现。
我们可能经常听说接口,比如PCI接口、AGP接口等,因此很多人认为接口等同于主板上的插槽,这其实一种错误的认识,当说PCI接口时,指的是主机板上那个插槽遵守了PCI规范,而具体的插槽只是PCI接口的实例。对于不同型号的主板而言,他们各自的PCI插槽都需要遵守一个规范,遵守这个规范就可以保证插入该插槽里的板卡能与主机板正常通信。
接口是从多个相似类中抽象出来的规范,接口不提供任何实现,接口体现的是规范和实现分离的设计哲学。例如主机板上提供了PCI插槽,只要一块显卡遵守PCI接口规范,就可以插入PCI插槽内,与该主机板正常通信。至于这块显卡是哪家制造的,内部如何实现的,主机板无须关心。
因此,接口定义的是多个类共同的公共行为规范,这些行为是与外部交流的通道,这就意味着接口里通常是定义一组公用方法。
- 接口里可以包含:
- 成员变量:只能是静态常量
- 方法:只能是抽象实例方法、类方法、默认方法、私有方法(Java 9新增)
- 内部类:包括内部接口、枚举。
1.2、接口的定义
接口的定义如下所示:
修饰符 interface 接口名 extends 父接口1,父接口2... {
//零到多个常量定义...
//零到多个抽象方法定义...
//零到多个默认方法、类方法、私有方法定义...
//零到多个内部类、接口、枚举类定义...
}
针对上面的语法作如下说明:
- 修饰符可以是public或者省略,若省略public,则默认采用包权限访问控制符(即只有在相同包结构下才可以访问该接口)。
- 接口名应与类名采用相同的命名规范;
- 一个接口可以有多个直接的父接口,但接口只能继承接口,不能继承类。
- 只有在Java 8以上的版本中才可以定义默认方法、类方法及私有方法(Java 9新增)。
与类相比,接口里的成员变量只能是静态常量,接口里的方法只能是抽象方法、类方法、默认方法及私有方法。
下面定义一个接口。
interface Output {
int MAX_CACHE_LINE = 50;
void out();//输出方法
void getData(String msg);//取得数据的方法
default void print(String... msgs) {
for (String msg : msgs) {
System.out.println(msg);
}
}
default void test() {
System.out.println("默认的test()方法");
}
static String staticTest() {
return "接口里的类方法";
}
}
上面定义了一个OutPut接口,这个接口里包含了一个成员变量:MAX_CACHE_LINE。除此之外,这个接口还定义了两个普通的方法:表示取得数据的getData()方法和表示输出的out()方法。这就定义了Output接口的规范:只要某个类能取得数据,并可以将数据输出,那它就是一个输出设备,置于这个设备的实现细节,这里暂时不关心。
- 接口定义的是多个类共同的公共行为规范,因此接口里的常量、方法、内部类和内部枚举都是public访问权限,若省略则默认为public权限,若使用则只能是public修饰符。
- 接口中定义的静态常量,不管是否使用修饰符,省略时,默认会加上public static final修饰。
- 接口里若不是定义的默认方法、类方法或私有方法,则系统自动为普通方法增加abstract修饰符,即普通的方法总是使用public abstract修饰。
- 接口里的普通方法不能有方法实现(即方法体),但类方法、默认方法、私有方法都必须由方法实现。
- 私有方法的主要作用是作为工具方法,为接口中的默认方法或类方法提供支持。私有方法既可以是类方法,也可以是实例方法。
- 接口中的内部类、内部接口、内部枚举默认都采用public static修饰。
- 接口中默认方法采用default进行修饰,总是被public进行修饰。接口中的默认方法就是实例方法。
- 接口支持多继承,而类只能是单继承,因此接口可以有多个直接的父类。子接口继承某个父接口,将会获得父接口里定义的所有抽象方法、常量。
下面我们写一个测试类,调用一下接口里的成员变量和类方法。
public class OutputFieldTest {
public static void main(String[] args) {
//使用接口调用静态常量
System.out.println(Output.MAX_CACHE_LINE);
//接口里定义的是静态常量(默认自带public static final),由于被final修饰,不允许被修改,以下语句会引发编译错误
//Output.MAX_CACHE_LINE=20;
//使用接口调用类方法
System.out.println(Output.staticTest());
}
}
结合上面的代码,从某个角度来看,接口可被当成一个特殊的类。
1.3、接口的继承
看下面的例子
interface InterfaceA {
int PROP_A = 1;
void testA();
}
interface InterfaceB {
int PROP_B = 2;
void testB();
}
interface InterfaceC extends InterfaceA, InterfaceB {
int PROP_C = 3;
void testC();
}
public class InterfaceExtendsTest {
public static void main(String[] args) {
System.out.println(InterfaceC.PROP_A);
System.out.println(InterfaceC.PROP_B);
System.out.println(InterfaceC.PROP_C);
}
}
上面程序中接口InterfaceC通过继承InterfaceA和InterfaceB,并且获得了它们的常量。
1.4、接口的使用
接口不能用于创建实例,但接口可以用于声明引用类型变量。当使用接口来声明引用类型的变量时,这个引用类型变量必须引用到其实现类的对象。除此之外,接口主要用途就是被实现类实现。总结一下接口的用途(类实现接口的语法这里就省略了):
- 定义变量,也可用于进行强制类型转换;
- 调用接口中定义的常量;
- 被其他类实现。
下面再定义一个Product接口,并定义一个Printer类,让其实现Product和Output接口。
interface Product {
int getProduceTime();
}
public class Printer implements Product, Output {
//通过接口中静态常量来初始化数组
private String[] printData = new String[MAX_CACHE_LINE];
private int dataNum = 0;//用以记录当前需打印的作业数
@Override
public void out() {
//只要还有作业就继续打印
while (dataNum > 0) {
System.out.println("打印机打印:" + printData[0]);
//把作业队列整体前移一位
System.arraycopy(printData, 1, printData, 0, --dataNum);
}
}
@Override
public void getData(String msg) {
if (dataNum >= MAX_CACHE_LINE) {
System.out.println("输出队列已满,添加失败!");
} else {
printData[dataNum++] = msg;//将打印数据添加到队列里,已保存的数据数量加一
}
}
@Override
public int getProduceTime() {
return 45;
}
public static void main(String[] args) {
//创建一个Printer对象,当成Output使用
Output o = new Printer();
o.getData("JavaEE实战");
o.getData("疯狂Java讲义");
o.out();
o.getData("疯狂Android讲义");
o.getData("疯狂Kotlin讲义");
o.out();
o.print("唐僧", "孙悟空", "猪八戒");//调用Output接口中的默认方法
o.test();
//创建一个Printer对象,当成Product使用
Product p = new Printer();
System.out.println(p.getProduceTime());
Object obj = p;//所有接口类型的引用变量都可直接赋给Object类型变量
}
}
上面的程序中Printer类实现了Product和Output接口,因此Printer对象皆可以赋给Output变量,又可以赋给Product变量。看着好像Printer类既是Output的子类,有事Product的子类,这就是Java提供的模拟多继承。而Printer由于实现了Output接口,则可以获取接口中定义的print()和test()两个默认方法,则Printer实例可以直接调用这两个默认方法(由于接口中的默认方法为实例方法)。
2、面向接口编程
内容总结
以上是互联网集市为您收集整理的Java面向对象(三)全部内容,希望文章能够帮你解决Java面向对象(三)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。