从屌丝到架构师的飞越(面向对象篇)-接口

一、介绍

Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

两种含义:一,Java接口,Java语言中存在的结构,有特定的语法和结构;二,一个类所具有的方法的特征集合,是一种逻辑上的抽象。前者叫做“Java接口”,后者叫做“接口”。

接口实现和类继承的规则不同,为了数据的安全,继承时一个类只有一个直接父类,也就是单继承,但是一个类可以实现多个接口,接口弥补了类的不能多继承缺点,继承和接口的双重设计既保持了类的数据安全也变相实现了多继承。

Java接口本身没有任何实现,因为Java接口不涉及表象,而只描述public行为,所以Java接口比Java抽象类更抽象化。但是接口不是类,不能使用new 运算符实例化一个接口。如 x=new comparable(......);//这个是错误来的。但是可以声明接口变量Comparable x; //这是允许的。

Java接口的方法只能是抽象的和公开的,Java接口不能有构造器,Java接口可以有public、static和final属性。即接口中的属性可以定义为 public static final int value=5;[1]

接口把方法的特征和方法的实现分割开来。这种分割体现在接口常常代表一个角色,它包装与该角色相关的操作和属性,而实现这个接口的类便是扮演这个角色的演员。一个角色由不同的演员来演,而不同的演员之间除了扮演一个共同的角色之外,并不要求其它的共同之处。

二、知识点介绍

1、基本概念

2、接口使用

3、接口的实际应用

三、上课对应视频的说明文档

1、基本概念

接口(Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合。接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

如果一个类只由抽象方法和全局常量组成,那么这种情况下不会将其定义为一个抽象类。只会定义为一个接口,所以接口严格的来讲属于一个特殊的类,而这个类里面只有抽象方法和全局常量,就连构造方法也没有。

范例:定义一个接口

interface A{//定义一个接口

public static final String MSG = "hello";//全局常量

public abstract void print();//抽象方法

}

2、接口使用

(1)由于接口里面存在抽象方法,所以接口对象不能直接使用关键字new进行实例化。接口的使用原则如下:

A、接口必须要有子类,但此时一个子类可以使用implements关键字实现多个接口;

B、接口的子类(如果不是抽象类),那么必须要覆写接口中的全部抽象方法;

C、接口的对象可以利用子类对象的向上转型进行实例化。

案例1:

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();

}

}

(2)对于子类而言,除了实现接口外,还可以继承抽象类。若既要继承抽象类,同时还要实现接口的话,使用一下语法格式:

class 子类 [extends 父类] [implemetns 接口1,接口2,...] {}

案例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()");

}

}

(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() {

}

}

由此可见,从继承关系来说接口的限制比抽象类少:

A、一个抽象类只能继承一个抽象父类,而接口可以继承多个接口;

B、一个子类只能继承一个抽象类,却可以实现多个接口(在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() {

}

}

3、接口的实际应用(标准定义)

在日常的生活之中,接口这一名词经常听到的,例如: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() ;

//传递具体的USB设备进接口

c.plugin(new Phone()) ;

c.plugin(new Print()) ;

c.plugin(new MP3());

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容