接口:语句定义格式:接口使用关键字:interface
interface 接口名{}
接口的实现:用implements表示
格式: class 类名 implements 接口名{}
接口不能实例化,
那么接口如何完成实例化呢?
:使用多态的形式进行实现,有具体的子类进行实例化,这是多态的一种,叫做接口多态。
:也可以用一个抽象类去实现。
接口中成员的特点:
1、成员变量:只能是常量,并且是静态的
JVM在真正运行之前会自动补齐修饰符:public static final(建议初学阶段手动补齐,在开发阶段,省略不写)
2、构造方法:没有,因为接口主要是扩展功能的,而没有具体存在
3、成员方法:只能是抽象方法
JVM在真正运行之前会自动补齐修饰符:public abstract(建议初学阶段手动补齐,在开发阶段,省略不写)
注意:当一个类实现具体的接口的时候,必须实现接口中所有的抽象方法
当一个抽象类实现接口的时候,可以选择不实现接口中的方法,也可以选择性的实现
类与类,类与接口,接口与接口的关系
类与类:存在继承关系,只能单继承,不能多继承,但可以实现多层继承
类与接口:实现关系,可以是单实现,也可以是一次性实现多个接口,也可以在继承一个类的同时,实现多个接口
接口也接口的关系:存在的是继承关系,可以是单继承,也可以是多继承
interface Inter1{}
interface Inter2{}
interface Inter3 extends Inter1,Inter2{} //接口与接口的关系
class Demo implements Inter1,Inter2{} //类与接口的关系
public class InterfaceDemo {
}
练习:
/*
属性:姓名,年龄
行为:吃饭,睡觉
狗:继承自动物
由于跳高是一个额外的功能,不是动物特有的,所以我们利用接口的方式去定义
接口:
跳高
部分的狗:实现接口
*/
abstract class Animal {
private String name;
private int age;
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//定义一个抽象方法,吃饭,睡觉
public abstract void eat();
public abstract void sleep();
}
class Dog extends Animal {
public Dog() {
}
public Dog(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("狗吃骨头");
}
@Override
public void sleep() {
System.out.println("狗睡得晚");
}
}
//定义一个接口,跳高
interface Jump {
public abstract void jump();//public abstract可省略不写
}
class JumpDog extends Dog implements Jump {
public JumpDog() {
}
public JumpDog(String name, int age) {
super(name, age);
}
@Override
public void jump() {
System.out.println("狗会跳高");
}
}
public class InterfaceText {
public static void main(String[] args) {
//创建一个不会跳高的狗
Animal d1 = new Dog("小黑", 2);
d1.eat();
d1.sleep();
//创建一个会跳高的狗
Dog d2 = new JumpDog("大黄", 3);
d2.eat();
d2.sleep();
JumpDog jd = (JumpDog) d2;
jd.jump();
}
}
运行结果: