持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天 @TOC
一、初始接口
1.1 什么是接口?
接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。
在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。
1.2 接口定义规则
Interface关键字用来声明一个接口。
interface 接口名称 {
// 声明变量
// 抽象方法
}
代码如下(示例):
interface IInterface {
//任何类型为 public static final 字段
//任何类型位 public abstract 方法
}
1.接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。 2.接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。 3.接口中的方法都是公有的。 4.接口中的方法和属性不要加任何修饰符号,保持代码简洁性.
二、接口的使用
接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法。 定义一个Animal接口:
//定义Animal接口
interface Animal {
void eat();
}
子类和父类之间是extends 继承关系,类与接口之间是 implements 实现关系。
class Dog implements Animal {
@Override
public void eat() {
System.out.println("吃狗粮!");
}
}
class Cat implements Animal {
@Override
public void eat() {
System.out.println("吃猫粮!");
}
}
测试一下接口是否支持多态:
public static void func(Animal animal) {
animal.eat();
}
public static void main(String[] args) {
func(new Dog());
func(new Cat());
}
二、接口的特性
1.接口类型是一种引用类型,但是不能直接new接口的对象
public static void main(String[] args) {
Animal animal = new Animal();
}
2.接口中的每一个方法都是隐式指定为public abstract,如果设定为其他修饰符都会报错
interface IInterface {
protected void func();
}
3.接口中的方法不能有具体的实现
interface Animal {
void eat(){
System.out.println("吃饭!");
}
}
4.重写接口方法时只能使用public访问限权修饰
class Dog implements Animal {
@Override
void eat() {
System.out.println("吃狗粮!");
}
}
5.接口中的变量默认为public static final变量
interface Animal {
int age = 18;
void eat();
}
public static void main(String[] args) {
System.out.println(Animal.age);//可以用接口名访问,证明是静态的
Animal.age = 20;//无法修改,说明被final修饰
}
6.接口中不能有静态代码块和构造方法
7.接口虽然不是类,但是在编译后生成的字节码文件后缀也是.class
8.如何一个类没有实现接口中的所有抽象方法,该类必须设置为抽象类.
9.JDK1.8中,接口中可以包含default方法.
10.接口间的继承
在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。即:用接口可以达到多继承的目的。
接口可以继承一个接口, 达到复用的效果. 使用 extends 关键字.
interface IRunning {
void running();
}
interface ISwimming {
void swimming();
}
//两栖动物,既有跑,又有游的功能
interface IAmphibious extends IRunning,ISwimming {
}
接口间的继承相当于把多个接口合并在一起.
三、实现多接口
java中,不支持多继承,但一个类可以实现多个接口.
//定义一个Animal类
class Animal {
public String name;
public Animal(String name) {
this.name = name;
}
}
//定义一组会飞的,会跑的,会游泳的接口
interface IFlying {
void fly();
}
interface IRunning {
void run();
}
interface ISwimming {
void swim();
}
我们创建几个具体的动物
class Cat extends Animal implements IRunning {
//猫是会跑的
public Cat(String name) {
super(name);
}
@Override
public void run() {
System.out.println(this.name+"正在跑");
}
}
class Fish extends Animal implements ISwimming {
//鱼会游泳
public Fish(String name) {
super(name);
}
@Override
public void swim() {
System.out.println(this.name+"正在游");
}
}
``
```java
class Frog extends Animal implements IRunning,ISwimming {
//青蛙会跑也会游
public Frog(String name) {
super(name);
}
@Override
public void run() {
System.out.println(name+"正在跑");
}
@Override
public void swim() {
System.out.println(name+"正在游");
}
}
注意:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类。 有了接口之后, 类的使用者就不必关注具体类型,而只关注某个类是否具备某种能力.
//我们实现一个方法,我们不用管到底是什么动物,只要会跑就可以调用.
public static void run(IRunning iRunning) {
iRunning.run();
}
//这里我们写一个机器人类
class Robot implements IRunning {
public String name;
public Robot(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println(name + "正在跑");
}
}
public static void main(String[] args) {
run(new Cat("喵喵"));
run(new Robot("机器人"));
}
在这里我们不用管是不是动物,只要具有这个功能即可调用.