上一篇:初识“多继承小帮手”-接口 | 带你学《Java面向对象编程》之五十七
【本节目标】
通过阅读本节内容,你将了解到使用接口时的几种转型情况与接口内访问权限的相关情况,学会正确的继承抽象类、实现接口,并能熟练处理接口对象的转型操作。
对象转型
但是这个时候我们就需要考虑一个实际的情况了,关于对象的转型问题了。
图一 对象转型
此时MessageImpl子类的对象可以任意的实现父接口的转换
范例:观察转换
interface IMessage { //定义了一个接口
public static final String INFO = “www.mldn.cn” ; //全局常量
public abstract String getInfo() ; //抽象方法
}
interface IChannel {
public abstract boolean connect() ; //定义抽象方法
}
class MessageImpl implements IMessage, IChannel{ //实现了接口
public String getInfo() {
if(this.connect()) {
return “得到一个消息,秘密的消息,有人胖了。”
}
return “通道创建失败,无法获取消息。”
}
public boolean connect() {
System.out.println(“消息发送通道已经成功建立。”) ;
return true ;
}
}
public class JavaDemo {
public static void main(String args[]) {
IMessage msg = new MessageImpl() ;
IChannel chl = (IChannel) msg ;
System.out.println(chl.connect()) ;
}
}
执行结果:
消息发送通道已经成功建立。
true
由于MessageImpl子类实现了IMessage与IChannel两个接口,所以这个子类可以是这两个接口任意一个接口的实例,那么就表示此时这两个接口实例之间是可以转换的。
在Java程序里面接口是不允许去继承父类的,所以说接口绝对不会是Object的子类,但是根据之前的分析可以发现,MessageImpl是Object子类,所以接口一定可以通过Object接收。
范例:观察Object与接口转换
interface IMessage { //定义了一个接口
public static final String INFO = “www.mldn.cn” ; //全局常量
public abstract String getInfo() ; //抽象方法
}
interface IChannel {
public abstract boolean connect() ; //定义抽象方法
}
class MessageImpl implements IMessage, IChannel{ //实现了接口
public String getInfo() {
if(this.connect()) {
return “得到一个消息,秘密的消息,有人胖了。”
}
return “通道创建失败,无法获取消息。”
}
public boolean connect() {
System.out.println(“消息发送通道已经成功建立。”) ;
return true ;
}
}
public class JavaDemo {
public static void main(String args[]) {
IMessage msg = new MessageImpl() ;
Object obj = msg ; //向上转型
IChannel chan = (IChannel) obj ;
System.out.println(chan.connect()) ;
}
}
执行结果:
消息发送通道已经成功建立。
true
Object类对象可以接收所有的数据类型,包括基本数据类型、类对象、接口对象、数组。
由于接口描述的是公共的定义标准,所以在接口之中所有的抽象方法的访问权限都为public,也就是说写与不写都是一样的,例如:下面的两个接口本质是完全相同的:
完整定义:
interface IMessage { //定义了一个接口
public static final String INFO = “www.mldn.cn” ;
public abstract String getInfo() ;
}
简化定义:
interface IMessage { //定义了一个接口
String INFO = “www.mldn.cn” ;
String getInfo() ;
}
方法不写访问权限也是public,不是default,所以覆写的时候只能够使用public。
接口虽然已经可以成功的进行定义,但是千万不要忽略,在实际的开发过程之中,实现接口的有可能是抽象类,也就是说一个抽象类可以实现多个接口,而一个普通类只能够继承一个抽象类并且可以实现多个父接口,但是要求先继承后实现。
范例:子类继承抽象类并且实现接口
interface IMessage { //定义了一个接口
public static final String INFO = “www.mldn.cn” ; //全局常量
public abstract String getInfo() ; //抽象方法
}
interface IChannel {
public abstract boolean connect() ; //定义抽象方法
}
abstract class DatabaseAbstract { //定义一个抽象类
//接口中的abstract可以省略,抽象类中不允许省略
public abstract boolean getDatabaseConnection() ;
}
class MessageImpl extends DatabaseAbstract implements IMessage, IChannel{ //实现了接口
public String getInfo() {
if(this.connect()) {
if (this. getDatabaseConnection()) {
return “得到一个消息,秘密的消息,有人胖了。”
}elae {
return “数据库消息无法访问。”
}
}
return “通道创建失败,无法获取消息。”
}
public boolean connect() {
System.out.println(“消息发送通道已经成功建立。”) ;
return true ;
}
public boolean getDatabaseConnection() {
return true ;
}
}
public class JavaDemo {
public static void main(String args[]) {
IMessage msg = new MessageImpl() ;
System.out.println(msg.getInfo()) ;
}
}
执行结果:
消息发送通道已经成功建立。
得到一个消息,秘密的消息,有人胖了。
虽然接口无法去继承一个父类,但是一个接口却可以通过extends继承若干个父接口,此时称为接口的多继承。
范例:实现接口的多继承
interface IMessage {
public abstract String getInfo() ; //抽象方法
}
interface IChannel {
public boolean connect() ;
}
//extends在类继承上只能够继承一个父类,但是接口上可以继承多个
interface IService extends IMessage ,IChannel { //接口多继承
public String service() ;
}
class MessageService implements IService {
public String getInfo() {
return null ;
}
public boolean connect() {
return true ;
}
public String service() {
return “获取消息服务。”
}
}
在实际的开发之中,接口的使用往往有三种形式:
进行标准设置;
表示一种操作的能力;
暴露远程方法视图,这个一般都在RPC分布式开发中使用。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学