一、进行Java语言设计时,为什么要引入接口的概念?
解:编程语言的本质是对自然界事物的抽象,因此会提供抽象机制。而接口的本质其实是更高层次的抽象类(纯粹的抽象类),用于弥补抽象类在抽象程度上的不足。抽象类是对子类覆写方法的控制,但抽象类中同时会存在一些普通方法。而接口则用于解决这些普通方法的安全或隐私问题,对外部隐藏实现细节。
二、什么是接口?
解:
(1)接口的本质:纯粹的Java抽象类;
(2)接口的定义:通过关键字interface进行定义。通常接口名前加上大写字母I进行区分。
(3)接口不可以直接实例化对象,必须被子类实现,且一个子类可以实现多个父接口,但仅能继承一个父类
(4)子类若非抽象类,必须覆写接口中的全部抽象方法;
package com.java.test;
interface IChannel
{
//接口中的abstract可以省略,但抽象类中的关键字abstract不可以省略
String name="Channel4";//必须为全局常量
String getName();//必须为抽象方法
}
interface IMessage
{
String Msg="0x888";
String getMsg();
}
class ImplSignal implements IChannel,IMessage//一个子类可以实现多个父接口(有限的多继承,有效的解决了Java中的单继承问题)
{
@Override//注解
public String getMsg() {
// TODO 自动生成的方法存根
return "获取到的报文为:"+Msg;
}
@Override
public String getName() {
// TODO 自动生成的方法存根
return "通道为:"+name;
}
}
public class InterfaceDemo {
public static void main(String[] args)
{
ImplSignal signalA=new ImplSignal();//接口无法实例化对象,必须通过子类实现
System.out.println(signalA.getMsg());
System.out.println(signalA.getName());
}
}
(5)接口对象可以通过子类对象的向上转型间接创建;
(6)子类的对象可以任意实现父接口的转换,且某一子类对象的父接口实例对象之间可以实现转换;
(7)接口不允许继承父类,因此接口不属于Object类的范畴(Object类可以接收所有的数据类型,包括:基本数据类型、数组、类对象等等);
public static void main(String[] args)
{
ImplSignal signalA=new ImplSignal();//接口无法实例化对象,必须通过子类实现
IMessage ImplMsg1=(IMessage)new ImplSignal();
IChannel ImplChannel1=(IChannel)ImplMsg1;
System.out.println(ImplMsg1.getMsg());
System.out.println(ImplChannel1.getName());
}
(8)接口描述的是一个公共的定义标准,接口中所有抽象方法的访问权限默认皆为public、而非Default
(9)接口无法继承一个父类,但接口可以继承若干父接口,即:接口的多继承
(10)实现接口的可能为抽象类,且一个抽象类可以实现多个接口,一个普通类只能继承一个抽象类并实现多个父接口,且必须先继承后实现。
package com.java.test;
interface IChannel
{
//接口中的abstract可以省略,但抽象类中的关键字abstract不可以省略
String name="Channel4";//必须为全局常量,默认访问权限为:public
String getName();//必须为抽象方法
}
interface IMessage
{
String Msg="0x888";
String getMsg();
}
interface IMsg
{
String IMsg="0x898";
String getIMsg();
}
abstract class AbSignal implements IChannel,IMessage
{
public abstract String getISignal();
}
class ImplSignal extends AbSignal implements IMsg//一个子类可以实现多个父接口(有限的多继承,有效的解决了Java中的单继承问题)
{
@Override//注解
public String getMsg() {//默认访问权限为:Default
// TODO 自动生成的方法存根
return "获取到的报文为:"+Msg;
}
@Override
public String getName() {
// TODO 自动生成的方法存根
return "通道为:"+name;
}
@Override
public String getISignal() {
// TODO 自动生成的方法存根
return null;
}
public String getIMsg() {
return null;
}
}
public class InterfaceDemo {
public static void main(String[] args)
{
ImplSignal signalA=new ImplSignal();//接口无法实例化对象,必须通过子类实现
IMessage ImplMsg1=(IMessage)new ImplSignal();
IChannel ImplChannel1=(IChannel)ImplMsg1;
System.out.println(ImplMsg1.getMsg());
System.out.println(ImplChannel1.getName());
}
}