接口不同于继承中的抽象类,接口体现事物的扩展性,也就是额外功能。
额外功能——不给出具体实现(抽象方法),需要此功能的类只需要实现该接口即可。
如猫狗案例中,一些训练的猫会转圈,狗会站立,如果把这些行为分别写在训练猫和训练狗类中,自然是可以,但是这样就体现不出继承的便利性,会显得代码臃肿。如果写在猫狗的父类动物类中,显然是不行的,因为不是所有猫狗都会这些技能。这时就应该写在技能接口里,训练猫和训练狗只需要继承各自的父类并实现各自的技能接口就行了。
注意:接口不是类
接口特点
A:接口用interface表示
interface 接口名 {}
B:类实现接口用implements表示
class 类名 implements 接口名 {}
C:接口不能实例化
但可以按照多态的方式实例化
D:接口的子类
a.可以是抽象类,但是意义不大,抽象类还得有子类
b.具体类(必须实现接口所有抽象方法)
接口成员特点
A:成员变量
只能是常量,并且是静态的。默认修饰符:public static final(建议手动补全这些修饰符)
B:构造方法
接口没有构造方法。所以构造实现接口的子类对象时调用的是Object类的构造方法。
C:成员方法
默认抽象方法,默认修饰符:public abstract (建议手动补齐),所以实现类实现接口方法时必须被public修饰(访问权限不能更低,不写的话默认default)
其他相关知识:
类与类:
继承关系,只能是单继承,可以多层继承
类与接口:
实现关系,只能是单实现,也可以多实现
并且还可以在继承一个类的同时,实现多个接口
接口与接口:
继承关系(不是实现关系,接口不能提供实现),可以单继承,也可以多继承
说明java其实有多继承,只不过是应用在接口,但java中的类只能单继承
例子说明:
/*
猫狗案例
分析:具体——>抽象
猫:
姓名,年龄
吃饭,睡觉
狗:
姓名,年龄
吃饭,睡觉
显然,猫狗存在共性,所以我们抽取出一个父类:动物类
动物:
姓名,年龄
吃饭();
睡觉() {}
一些猫狗经过训练后会表演,表演的额外功能是一个扩展特性,所以定义一个接口
接口:
表演
部分猫:继承猫类,实现表演
部分狗:继承狗类,实现表演
实现:抽象———>具体
*/
//定义表演接口
interface Showing {
public abstract void show();
}
//定义抽象类
abstract class Animal {
String xiaoming;
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;
}
//吃法不同,故定义eat抽象方法
public abstract void eat();
//睡觉基本相同,故定义sleep具体方法
public void sleep() {
System.out.println("睡觉");
}
}
//狗类
class Dog extends Animal {
public Dog() {}
public Dog(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("吃狗粮");
}
}
//猫类
class Cat extends Animal {
public Cat() {}
public Cat(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("吃猫粮");
}
}
//特殊表演猫类
class ShowCat extends Cat implements Showing {
public ShowCat () {}
public ShowCat (String name,int age) {
super(name,age);
}
public void show() {
System.out.println("猫表演被老鼠追");
}
}
//特殊表演狗类
class ShowDog extends Dog implements Showing {
public ShowDog () {}
public ShowDog (String name,int age) {
super(name,age);
}
public void show() {
System.out.println("狗表演吃狗粮");
}
}
class InterfaceTest {
public static void main(String[] args) {
//测试表演猫
ShowCat cat = new ShowCat("汤姆猫",99);
System.out.println(cat.getName() + " " + cat.getAge());
cat.eat();
cat.sleep();
cat.show();
//测试表演狗类
ShowDog dog = new ShowDog();
dog.setName("忠犬八公");
dog.setAge(10);
System.out.println(dog.getName() + " " + dog.getAge());
dog.eat();
dog.sleep();
dog.show();
}
}
//个人认为,在这个例子中,猫和狗其实没有姓名、年龄这两个属性的,这两个属性在动物类中被private修饰不能继承。不知道有没有什么弊端。