1. 接口的由来
-
定义抽象类
-
把抽象类中,所有的属性,所有构造方法,所有成员方法删除
- 只剩下抽象方法
-
把定义抽象类的 abstract class 修改为 interface
- 此时这个类就不再成为抽象类,而是称为接口
-
把抽象类子类继承父类的关键字extends修改为implements
package com.qfedu;
public class Demo01 {
public static void main(String[] args) {
Animal a = new Duck();
a.eat();
}
}
interface Animal {
public abstract void call();
public abstract void eat();
}
class Duck implements Animal{
@Override
public void call() {
System.out.println("嘎嘎嘎---");
}
@Override
public void eat() {
System.out.println("鸭子,到河里逮鱼吃");
}
}
2. 接口的定义
public interface 接口名 {
//抽象方法
}
-
接口不能属性,成员方法,构造方法
-
接口可以定义抽象方法
- 抽象方法的使用范围修饰符必须是public
- 定义抽象方法,可以不定义public abstract,默认就是由public abstract修饰
-
接口可以定义公开的静态常量
- 可以忽略掉public static final,定义一个变量,默认的修饰符就是public static final
由于接口中定义的都是抽象方法,想要使用该方法,必须为接口定义实现类
- 使用implements关键字,表示一个类对接口的实现
- 实现类必须实现接口中所有的抽象法
public 类 implements接口名 {
//实现接口中所有的抽象方法(也可以理解为子类重写父类的方法)
}
package com.qfedu;
public class Demo02 {
public static void main(String[] args) {
//接口(父类)的引用,指向到实现类(子类)的对象
A a1 = new B();
a1.m1();
A a2 = new C();
a2.m1();
/*
* 接口的引用,指向到不同实现类的对象,执行接口中的方法,也会产生多态
*/
/*
* 1. 定义接口 X,有两个抽象方法 m1(),m2()
* 2. 定义类Y,W实现接口X
* 3. 定义两个变量,数据类型为X,分别指向Y,W对象,然后执行m2()方法
*
*/
}
}
interface A {
void m1();
}
class B implements A {
@Override
public void m1() {
System.out.println("B 实现 m1");
}
}
class C implements A {
@Override
public void m1() {
System.out.println("C 实现 m1");
}
}
3. 接口的特点
在java中类是单继承的,一个类一旦继承一个类,就不能再表示其他类型的事物。
但是在现实中,一个对象拥有多种身份是很正常的。
思考:你咋就成为了英雄呢?
- 和属性没有关系
- 和行为有关系,是你做到这些事情,你就是一个英雄
特点:
- 一个类实现多个接口,解决我们不能多继承的问题
- 接口可以多继承,一个接口可以继承多个接口
package com.qfedu;
public class Demo04 {
}
interface Hero {
//救人
void rescuePerson();
//挽救财产
void savingProperty();
}
interface QfStudent {
void studyCoding();
}
/*
* 一个类实现多个接口,解决我们不能多继承的问题
*/
class QfHero implements Hero, QfStudent {
@Override
public void studyCoding() {
System.out.println("起早贪黑写代码----");
}
@Override
public void rescuePerson() {
System.out.println("放开他,让我来----");
}
@Override
public void savingProperty() {
System.out.println("把你们的手机,钱包都给我,我跑的快----");
}
}
interface Teacher {
//教授知识
void teach();
}
interface Chef {
//做菜
void cooking();
}
/*
* 接口可以多继承
*/
interface XDFTeacher extends Teacher, Chef {
}
class XDFTeacherImpl implements XDFTeacher {
@Override
public void teach() {
}
@Override
public void cooking() {
}
}