Java接口

Java接口(interface)

一、什么是接口?

1、生活中的接口

USB接口

USB接口

USB接口可以连接U盘, 移动硬盘, 鼠标, 键盘, 手机,…

U盘, 移动硬盘, 鼠标, 键盘, 手机等之所以能连接USB, 是因为这些硬件在制造的时候已经遵循了USB的连接标准.

2、Java中的接口

Java中的接口与生活中的接口一样, 也是用于定义标准.

既然是定义标准, 也就意味着接口中只规定有哪些方法, 但是并不提供这些方法的具体实现. 谁用这套标准谁来实现.

3、其他编程语言中的接口

除了Java有接口的概念以外, 很多编程语言都有接口的概念.

Java中用interface来表示接口

C#、C++、PHP等语言中也是使用interface来表示接口

Objective-C中使用protocol来表示接口.

二、Java中如何定义接口

既然接口是一套标准,如何制定这套标准呢?

1、使用interface定义接口

在java中使用interface关键之定义接口,具体语法格式如下:

public interface 接口名{
 方法的声明   
}

接口的示例如下:

public interface Driver{
    public void drive(Car car);//开车
}

上面定义了一个接口叫Driver(即:司机), 接口里规定了司机必须会开车, 也就是说谁想要成为司机, 谁必须要会开车.

2、如何使用接口—(implements)

接口是一套标准, 内部只声明方法, 不提供实现. 谁要使用接口谁负责实现接口.实现接口使用implements关键字.

实现接口的语法格式如下:

public class Programmer implements Driver{
    ...
    public void drive(Car car){
        System.out.println("程序员在小心翼翼的开车回家");
    }
}

上面的代码是Programmer类(即:程序员类)实现了Driver接口, 所谓的实现接口, 指的是实现接口中定义的全部方法.

由于程序员类实现了司机接口中的全部方法, 因此具备了司机所需要的全部技能, 所以程序员不再是普通的程序员, 而是一个会开车的程序员.(既是司机又是程序员)

再看下面的代码:

public class Actor implements Driver{
    ...
    public void drive(Car car){
        System.out.println("演员在开车兜风");
    }
}

上面的代码是Actor类(即:演员类)实现了Driver接口, 因此演员也不是普通的演员, 而是一个会开车的演员.

3、一个类实现多个接口—(不会开车的厨师不是好程序员)

定义另外一个接口Cook(即:厨师)

public interface Cook{
    public void cook();//做饭
    public void washFoodMaterial();//洗菜
}

定义一个类(Programmer)同时实现Driver接口和Cook接口.

public class Programmer implements Driver, Cook{
    ...
    public void drive(Car car){
        System.out.println("程序员在小心翼翼的开车回家");
    }
    public void cook(){
        System.out.println("程序员做了美味的饭菜");
    }
    public void washFoodMaterial(){
        System.out.println("洗菜");
    }
}

上述代码Programmer实现了Driver和Cook接口, 即:实现了2个接口中规定的全部方法. 因此程序员具备了司机的技能和厨师的技能. 可以认为此程序员具备3种身份: 程序员,司机以及厨师.

三、接口有什么用?

1、实现多继承

众所周知, Java只允许类单继承, 并不支持类的多继承.

接口提供了一种间接实现多继承方式.只需要让类实现多个接口即可.

注意接口实现的多继承与C++中的多继承不同, C++是真正意义上的多继承, 每个父类的属性和方法都会继承, 而接口实现的多继承更多是继承方法, 因为接口中不能定义属性(能定义类常量).

2、多态

多态是面向对象的一个重要特征, 它允许父类引用指向子类对象.

既然接口可以实现继承乃至多继承, 因此可以把接口看做是实现类的父类, 进而产生多态的效果.

Driver zhangsan =  new Progarmmer();

上述代码就是把 程序员看作了司机, 之所以程序员能看作司机, 是因为程序员实现了Driver接口, 具有了司机全部的功能(方法).

四、接口的注意事项

1、接口里面的方法都必须是 public abstract类型的

即便你没有写修饰符,也会默认给你加上public abstract。

2、接口可以看成一个特殊的抽象类

接口里的所有方法都是抽象方法。这个类可以看成是一个抽象类,因此接口不能创建对象。只能有实现类创建类。

实现类就是实现接口的类。

3、接口里面可以有属性

接口里可以有属性,但是属性必须是public static final修饰的属性,也就是说接口里面只能定义 静态常量。既然是常量,命名方式应该全部大写。访问方式参考static的访问方式。

4、接口可以继承别的接口

接口可以继承别的接口,在定义接口的时候使用extends关键字来继承别的接口。

一旦一个接口继承了别的接口,那么这个接口的实现类也要把继承的方法实现了。

五、接口与抽象类有什么异同

1、能否定义属性

抽象类:抽象能定义静态属性以及非静态属性。

接口:只能定义静态属性,并且这个静态属性必须是final类型的静态属性。本质上是常量。

抽象类:能对属性进行读取以及写入操作。

接口:只能读取属性的值,但是不能更改属性的值。

2、访问修饰符

属性修饰符:

​ 抽象类:public, 默认, protected, private ; static final

​ 接口: 只能是public; static final。

方法修饰符:

​ 抽象类:public, 默认, protected , private。static ,final, abstract

​ 接口:public abstract

3、能否有构造器

抽象类: 可以有。

接口:不可以。虽然接口可以看成类但是接口不是类。

4、能否包含抽象方法

抽象类:可以包含

接口: 可以包含,必须是抽象方法

5、能否包含非抽象方法

抽象类: 可以。

接口:不可以。

6、是否可以包含初始化块

抽象类:可以。

接口:不可以。

7、是否可以包含内部类

抽象类:可以。

接口:可以

8、继承

抽象类:一个普通类只能继承一个抽象类。

接口:一个普通类可以实现多个接口。

六、什么时候用接口?什么时候用抽象类?

接口的核心用途

定义一些方法,供实现类去实现。

抽象类的核心用途

定义一些方法以及一些属性,供子类继承。

如果只是想增加几个方法,优先使用接口。让你的类去实现某个接口(接口里是你想要增加的方法)。

如果既要增加方法又要增加属性,使用抽象类。让你的类继承抽象类,这样就可以获得抽象类中的属性,而且还可以实现抽象类中的方法。

有一种情况,只能用接口不能用抽象类。-----多继承。你要实现的方法分别在多个接口里,你可以使用实现接口的方式来完成。但是你不能继承多个类。

抽象类以及接口都是在讲述如何去设计项目中的类。

如果既要增加方法又要增加属性,使用抽象类。如果只想要方法,使用接口。

练习

1.定义一个接口Shout(叫声),接口中定义一个叫声方法shout,定义Dog,Cat类分别实现Shout接口。
2.定义一个接口Driver(司机),接口中定义一个开车方法drive,定义一个Person类,让Person实现Driver接口。
3.定义一个接口Keeper(保安),接口中定义一个openDoor、patrol和closeDoor方法,让上述Person类实现Keeper接口。
4、定义一个接口Racer(赛车手),让Racer接口继承Driver接口,Racer接口内定义race方法。定义一个Programmer类,让这个类实现Racer接口。
5、定义Person类(包含姓名,年龄,身高属性),定义Student类继承于Person类,定义Teacher类继承于Person类。定义一个接口MyComparable,接口中定义int compareTo(Person other)方法。让Student和Teacher分别实现MyComparable接口,Student的compareTo方法按年龄比较大小,Teacher的compareTo按身高比较大小。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值