java--接口
java--接口
转载自:https://blog.csdn.net/wei_zhi/article/details/52738471
一、接口特性
- 接口只定义了类应当遵循的规范,却不关心这些类的内部数据和其方法内的实现细节
- 接口只规定了这些类必须提供的方法,从而分离了规范和实现,增强了系统的可扩展性和维护性。
二、接口定义
- 接口定义一种规范,规定一个类必须做什么,但他不管如何具体去做。
- 【修饰符】interface 接口名称 extends 父接口1,父接口2.........
- 没有构造方法,不能实例化;
- 接口只能继承接口,不能继承类;
- 接口里没有普通方法,方法全是抽象方法;
- 接口里的方法默认修饰符是 public abstract;
- 接口里的字段全是全局常量,默认修饰符是 public static final;
- 接口里的成员包括:全局常量,公共的抽象方法,内部类(内部类,内部接口,内部枚举类);
三、接口的实现
1、由于接口里面存在抽象方法,所以接口对象不能直接使用关键字new进行实例化。接口的使用原则如下:
(1)接口必须要有子类,但此时一个子类可以使用implements关键字实现多个接口;
(2)接口的子类(如果不是抽象类),那么必须要覆写接口中的全部抽象方法;
(3)接口的对象可以利用子类对象的向上转型进行实例化。
范例:
-
package com.wz.interfacedemo;
-
-
interface A{//定义一个接口A
-
-
public static final String MSG = "hello";//全局常量
-
-
public abstract void print();//抽象方法
-
}
-
-
interface B{//定义一个接口B
-
-
public abstract void get();
-
}
-
-
class X implements A,B{//X类实现了A和B两个接口
-
-
@Override
-
public void print() {
-
System.out.println("接口A的抽象方法print()");
-
}
-
-
@Override
-
public void get() {
-
System.out.println("接口B的抽象方法get()");
-
}
-
-
}
-
-
public class TestDemo {
-
-
public static void main(String[] args){
-
-
X x = new X();//实例化子类对象
-
A a = x;//向上转型
-
B b = x;//向上转型
-
-
a.print();
-
b.get();
-
}
-
-
}
运行结果:
-
接口A的抽象方法print()
-
接口B的抽象方法get()
2、对于子类而言,除了实现接口外,还可以继承抽象类。若既要继承抽象类,同时还要实现接口的话,使用一下语法格式:
class 子类 [extends 父类] [implemetns 接口1,接口2,...] {}
-
interface A{//定义一个接口A
-
-
public static final String MSG = "hello";//全局常量
-
-
public abstract void print();//抽象方法
-
}
-
-
interface B{//定义一个接口B
-
-
public abstract void get();
-
}
-
-
abstract class C{//定义一个抽象类C
-
public abstract void change();
-
}
-
-
class X extends C implements A,B{//X类继承C类,并实现了A和B两个接口
-
-
@Override
-
public void print() {
-
System.out.println("接口A的抽象方法print()");
-
}
-
-
@Override
-
public void get() {
-
System.out.println("接口B的抽象方法get()");
-
}
-
-
@Override
-
public void change() {
-
System.out.println("抽象类C的抽象方法change()");
-
-
}
-
-
}
对于接口,里面的组成只有抽象方法和全局常量,所以很多时候为了书写简单,可以不用写public abstract 或者public static final。并且,接口中的访问权限只有一种:public,即:定义接口方法和全局常量的时候就算没有写上public,那么最终的访问权限也是public,注意不是default。以下两种写法是完全等价的:
-
interface A{
-
public static final String MSG = "hello";
-
public abstract void print();
-
}
等价于
-
interface A{
-
String MSG = "hello";
-
void print();
-
}
但是,这样会不会带来什么问题呢?如果子类子类中的覆写方法也不是public,我们来看:
-
package com.wz.interfacedemo;
-
-
interface A{
-
-
String MSG = "hello";
-
-
void print();
-
}
-
-
class X implements A{
-
-
void print() {
-
System.out.println("接口A的抽象方法print()");
-
}
-
-
}
-
-
public class TestDemo {
-
public static void main(String[] args){
-
-
A a = new X();
-
a.print();
-
}
-
}
运行结果:
-
Exception in thread "main" java.lang.IllegalAccessError: com.wz.interfacedemo.X.print()V
-
at com.wz.interfacedemo.TestDemo.main(TestDemo.java:22)
这是因为接口中默认是public修饰,若子类中没用public修饰,则访问权限变严格了,给子类分配的是更低的访问权限。所以,在定义接口的时候强烈建议在抽象方法前加上public ,子类也加上:
-
interface A{
-
-
String MSG = "hello";
-
-
public void print();
-
}
-
-
class X implements A{
-
-
public void print() {
-
System.out.println("接口A的抽象方法print()");
-
}
-
-
}
3、在Java中,一个抽象类只能继承一个抽象类,但一个接口却可以使用extends关键字同时继承多个接口(但接口不能继承抽象类)。
-
interface A{
-
public void funA();
-
}
-
-
interface B{
-
public void funB();
-
}
-
-
//C接口同时继承了A和B两个接口
-
interface C extends A,B{//使用的是extends
-
public void funC();
-
}
-
-
class X implements C{
-
-
@Override
-
public void funA() {
-
-
-
}
-
-
@Override
-
public void funB() {
-
-
-
}
-
-
@Override
-
public void funC() {
-
-
-
}
-
-
}
由此可见,从继承关系来说接口的限制比抽象类少:
(1)一个抽象类只能继承一个抽象父类,而接口可以继承多个接口;
(2)一个子类只能继承一个抽象类,却可以实现多个接口(在Java中,接口的主要功能是解决单继承局限问题)
4、从接口的概念上来讲,接口只能由抽象方法和全局常量组成,但是内部结构是不受概念限制的,正如抽象类中可以定义抽象内部类一样,在接口中也可以定义普通内部类、抽象内部类和内部接口(但从实际的开发来讲,用户自己去定义内部抽象类或内部接口的时候是比较少见的),范例如下,在接口中定义一个抽象内部类:
-
interface A{
-
public void funA();
-
-
abstract class B{//定义一个抽象内部类
-
public abstract void funB();
-
}
-
}
在接口中如果使用了static去定义一个内接口,它表示一个外部接口:
-
interface A{
-
public void funA();
-
-
static interface B{//使用了static,是一个外部接口
-
public void funB();
-
}
-
}
-
class X implements A.B{
-
-
@Override
-
public void funB() {
-
-
}
-
-
}
三、接口的实际应用(标准定义)
在日常的生活之中,接口这一名词经常听到的,例如:USB接口、打印接口、充电接口等等。
如果要进行开发,要先开发出USB接口标准,然后设备厂商才可以设计出USB设备。
现在假设每一个USB设备只有两个功能:安装驱动程序、工作。
定义一个USB的标准:
-
interface USB { // 操作标准
-
public void install() ;
-
public void work() ;
-
}
在电脑上应用此接口:
-
class Computer {
-
public void plugin(USB usb) {
-
usb.install() ;
-
usb.work() ;
-
}
-
}
定义USB设备—手机:
-
class Phone implements USB {
-
public void install() {
-
System.out.println("安装手机驱动程序。") ;
-
}
-
public void work() {
-
System.out.println("手机与电脑进行工作。") ;
-
}
-
}
定义USB设备—打印机:
-
class Print implements USB {
-
public void install() {
-
System.out.println("安装打印机驱动程序。") ;
-
}
-
public void work() {
-
System.out.println("进行文件打印。") ;
-
}
-
}
定义USB设备—MP3:
-
class MP3 implements USB {
-
public void install() {
-
System.out.println("安装MP3驱动程序。") ;
-
}
-
public void work() {
-
System.out.println("进行MP3拷贝。") ;
-
}
-
}
测试主类:
-
public class TestDemo {
-
public static void main(String args[]) {
-
Computer c = new Computer() ;
-
c.plugin(new Phone()) ;
-
c.plugin(new Print()) ;
-
c.plugin(new MP3());
-
}
-
}
运行结果:
-
安装手机驱动程序。
-
手机与电脑进行工作。
-
安装打印机驱动程序。
-
进行文件打印。
-
安装MP3驱动程序。
-
进行MP3拷贝。
可以看出,不管有多少个USB接口的子类,都可以在电脑上使用。
在现实生活中,标准的概念随处可见,而在程序里标准使用接口定义的。
文章来源: brucelong.blog.csdn.net,作者:Bruce小鬼,版权归原作者所有,如需转载,请联系作者。
原文链接:brucelong.blog.csdn.net/article/details/79722008
- 点赞
- 收藏
- 关注作者
评论(0)