CoreJava基础之面向对象:接口(interface)

1.接口的概念

接口是特殊的抽象类,是Java独有的语法

接口是功能的集合,同时也是一种数据类型,是一种比抽象类更加抽象的抽象类

接口只是描述了应当具备的功能,并没有具体的实现的方法体 具体的实现交给接口的实现类

这样就可以将功能的定义和功能的实现进行分离,实现程序的优化设计

注意:一切事物均有功能 一切事物均有接口

2.接口的定义

接口定义中需要使用关键字:interface 

定义接口后生成的仍是.class文件 源文件的类型仍是.java文件

//定义接口语法:
public interface 接口名{
	抽象方法1:
	抽象方法2:
	抽象方法3:
	·······
}
//例如:
public interface Person{
	//接口中的方法为抽象方法 无方法体
	public abstract void eat()
	public abstract void sleep()
	public abstract void run()
}

注意:

            1.将class替换成interface

            2.接口中的方法全部为 公共的 抽象方法 且没有方法体

3.类实现接口

概念:

 类与接口是类实现接口的关系,即:类实现接口。

 实现需要用到关键字:implement

 类实现接口后就能证明自己已经具备了这种功能

实现:

    实现类仍然需要覆盖(实现)方法以实现功能

//类实现接口语法:
class 类 implements 接口名{
	重写接口中的方法
}
//例如:
public interface Person{
	//接口中的方法为抽象方法 无方法体
	public abstract void eat()
	public abstract void sleep()
	public abstract void run()
}
//Students类实现接口Person
class Students implements Person{
	//重写接口中的方法
	public void eat(){}
	public void sleep(){}
	public void run(){}
}

思考:类是现实事物的描述,接口是功能的集合。

4.接口中的成员(成员变量和成员方法)

(1)接口中的成员变量

①成员变量的特点:没有变量,全都是常量

②成员变量的固定格式:public static final 数据类型 变量名 =值

public interface Person{
	//定义格式:public static final 数据类型 变量名 = 值
	public static final int age =25;
}
修饰符解释意思
public 权限 公开
static 可以被类名直接调用
final最终,固定住变量的值

以上三个修饰符在接口的定义中可以省略不写,但是,不写不等于没有,三个修饰符也可以,选择性书写

③使用接口中定义的常量

常量被静态修饰,可以被类名直接调用,被接口的名字直接调用

(2)接口中的成员方法

①接口中的成员方法都是抽象方法

②定义抽象方法(固定抽象方法)

public abstract 返回值类型 方法名 (参数列表)

注:此处写不写public都是public 不是默认default 默认是public

public interface Person{
	//接口中的方法为抽象方法 无方法体
	//固定格式:public abstract 返回值类型 方法名(参数表)
	public abstract void eat()
	public abstract int sleep(int age)
	public abstract double  run(int age)
}

特点:

1.接口不可以创建对象

2.子类必须覆盖掉接口中全部的抽象方法后,子类才可以实例化,否则子类只能是一个抽象类

5.接口的多实现

接口最重要的体现:解决多继承存在的弊端,将多继承的这种机制在Java中实现

public interface Person{
	//定义格式:public static final 数据类型 变量名 = 值
	public static final int age =25;
	//接口中的方法为抽象方法 无方法体
	//固定格式:public abstract 返回值类型 方法名(参数表)
	public abstract void eat()
	public abstract int sleep(int age)
	public abstract double  run(int age)
}
//接口Study
public interface Study{
        //抽象的study(){}
        public abstract void study(){}
}
//Students类实现接口Person,Study 多实现
class Students implements Person,Study{
	//重写接口中的方法
	public void eat(){}
	public void sleep(){}
	public void run(){}
    public void study(){}
}

多继承的弊端是什么呢?

多继承时,当多个父类中相同的方法的时候,子类调用会产生不稳定性

为什么接口的多实现可以解决呢?

因为接口中的方法都是抽象的方法并且没有方法体,由子类来明确。

6.类继承类 同时实现接口

    接口和类之间可以通过类的实现来实现接口的功能,同时我们之前已经知道类与类之间可以通过继承实现关系,当一个类已经继承了另一个父类,它又需要添加额外的功能时,这时候接口就可以派上用场了

   子类通过继承父类扩展功能,通过继承拓展的功能都是子类具备的基础功能。如果子类想继续扩展其他的功能?这时可以通过接口来实现

//创建父类A
class A{
	//A类中的方法eat()
	public void eat(){}
}
//创建接口B
interface B{
	//抽象方法sleep()
	public abstract void sleep();
}
//C类继承A类 实现B类的接口
class C extends A implements B{
	//C类实现了B接口的sleep()方法
	public void sleep(){
	
	}
}
//这样C类就具有了eat()和sleep()两种功能

7.接口与接口之间的关系(接口的多继承)

多个接口之间也可以相互继承

利用关键字 extends

//创建接口A
interface A{
	//A接口中的方法eat()
	public abstract void eat();
}
//创建接口B
interface B{
	//抽象方法eat()
	public abstract void eat();
}
interface C{
	public abstract void eat();

}
//D接口继承A,B,C接口
interface D implements A,B,C{
	//D接口需要重写eat方法
	public void eat(){
	}
}
//以上就是接口与接口之间的继承关系

由于接口中的方法都是抽象方法,所以当子类接口重写实现以后也不会出现调用不明确的情况

8.接口的好处:

开发中的好处:(1)接口的出现拓展了功能

                          (2)接口就是暴露出来的规则

                          (3)接口的出现降低了耦合性,即设备与设备之间的解耦

                         (4)接口的出现方便后期的更新和维护

9.接口和抽象的区别

明白了接口思想和接口的用法后,接口和抽象类的区别是什么呢?接口在生活体现也基本掌握,那在程序中接口是如何体现的呢?

通过实例进行分析和代码演示抽象类和接口的用法。

1、举例:

犬:

    行为:

             吼叫;

             吃饭;


缉毒犬:

      行为:

           吼叫;

           吃饭;

           缉毒;

2、思考:

由于犬分为很多种类,他们吼叫和吃饭的方式不一样,在描述的时候不能具体化,也就是吼叫和吃饭的行为不能明确。当描述行为时,行为的具体动作不能明确,这时,可以将这个行为写为抽象行为,那么这个类也就是抽象类。

可是当缉毒犬有其他额外功能时,而这个功能并不在这个事物的体系中。这时可以让缉毒犬具备犬科自身特点的同时也有其他额外功能,可以将这个额外功能定义接口中。

         如下代码演示:

interface 缉毒{
	public abstract void 缉毒();
}
//定义犬科的这个提醒的共性功能
abstract class 犬科{
public abstract void 吃饭();
public abstract void 吼叫();
}
// 缉毒犬属于犬科一种,让其继承犬科,获取的犬科的特性,
//由于缉毒犬具有缉毒功能,那么它只要实现缉毒接口即可,这样即保证缉毒犬具备犬科的特性,也拥有了缉毒的功能
class 缉毒犬 extends 犬科 implements 缉毒{

	public void 缉毒() {
	}
	void 吃饭() {
	}
	void 吼叫() {
	}
}
class 缉毒猪 implements 缉毒{
	public void 缉毒() {
	}
}

3、通过上面的例子总结接口和抽象类的区别:

相同点:

  1. 都位于继承的顶端,用于被其他类实现或继承;
  2. 都不能直接实例化对象;
  3. 都包含抽象方法,其子类都必须覆写这些抽象方法;

区别:

  1. 抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性;接口只能包含抽象方法;
  2. 一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)
  3. 抽象类是这个事物中应该具备的你内容, 继承体系是一种 is..a关系
  4. 接口是这个事物中的额外内容,继承体系是一种 like..a关系

二者的选用:

  1. 优先选用接口,尽量少用抽象类;
  2. 需要定义子类的行为,又要为子类提供共性功能时才选用抽象类;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员巨轮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值