一.什么是接口
1.在抽象类的使用中,可以给子类内容提供很好的规范和模板,其子类必须要重写实现抽象父类的抽象方法,但是有些时候,有些子类并不需要重写父类的一些抽象方法,为了解决这个问题,接口的就诞生了,接口是比抽象类还要抽象的抽象类
2.接口就是比“抽象类”还要抽象的“抽象类”。在接口中所有的方法都是抽象方法(比较稳定),不可提供任何实现
- 接口就是“规范” 定义了:“如果你是…你就必须…”的规则
- 接口全面的实现了 规范和具体实现 的分离
3.声明格式
- [访问修饰符] interface 接口名 [extends 父接口1,父接口2]{
- 常量定义
- 方法定义
- }
- 访问修饰符:只能为public或默认
- extends:接口可以多继承
- 常量:接口中的属性只能是常量、总是 public static final修饰 不写也是
- 方法:接口中的方法只能是 public abstract 。不写也是
- 1.实现类通过implements来实现接口中的规范
- 2.接口不能创建实例,但是可以用于声明引用变量类型
- 3.一个类实现了一个接口,就必须实现接口中所有的方法,并且这些方法都是public的
二.测试接口和实现类 实例1
public class Test01 {
public static void main(String[] args) {
// Fly f = new Fly();//接口是抽象的 不能被实例化
Fly f = new Angel(); //但是可以用于声明引用变量类型
f.fly(); //天使会飞
// f.simile();无法调用 此时编译器认为f是接口的实例
Angel a = new Angel();
a.smile(); //天使在微笑
Kindness k = new SuperMan();
k.helpOthers();
}
}
/**飞行接口*/
interface Fly{
void fly();
}
/**善良接口*/
interface Kindness{
void helpOthers();
}
class Angel implements Fly,Kindness{
@Override
public void helpOthers() { //实现接口的方法
System.out.println("天使喜欢帮助他人");
}
@Override
public void fly() { //实现接口的方法
System.out.println("天使会飞");
}
public void smile() { //自己独特的方法
System.out.println("天使在微笑");
}
}
class SuperMan implements Kindness{
@Override
public void helpOthers() { //实现接口的方法
System.out.println("好人喜欢帮助他人");
}
}
class BirdMan implements Fly{
@Override
public void fly() { //实现接口的方法
System.out.println("鸟人会飞");
}
}
这个案例表明
1.class Angel implements Fly,Kindness 一个实现类可以实现多个接口
2.Fly f = new Angel(); 接口可以用于声明引用变量类型,此时f只能调用接口中的方法和属性,运行时系统才知道f是天使的实例。
三.接口 继承的综合运用 实例二
public class Test02 {
public static void main(String[] args) {
show(new Cattle());
System.out.println();
show(new Cat());
System.out.println();
show(new Dog());
}
public static void show(Animal a) {
a.eat();
if(a instanceof Work) //如果a是Word的实例 那么就把a转换为Work
((Work) a).work();
}
}
/**动物父类*/
class Animal{
public void eat() {
System.out.println("动物吃饭");
}
}
/**工作接口*/
interface Work{
void work();
}
/**Dog子类*/
class Dog extends Animal implements Work{
@Override
public void work() {
System.out.println("狗可以看门");
}
public void eat() {
System.out.println("狗喜欢吃骨头");
}
}
/**Cattle子类*/
class Cattle extends Animal implements Work{
@Override
public void work() {
System.out.println("牛可以耕地");
}
public void eat() {
System.out.println("牛喜欢吃草");
}
}
/**Cat子类*/
class Cat extends Animal {
public void eat() {
System.out.println("猫喜欢吃鱼");
}
}
运行结果
所以说:
new Cattle()既是Animal的实例也是Work的实例
new Dog()既是Animal的实例也是Work的实例
new Cat()只是是Animal的实例
另外
if(a instanceof Work) //如果a是Word的实例 那么就把a转换为Work
((Work) a).work();
这里需要说一下,在Java中无论试讲一个类向上转型为父类对象,还是向上转型为抽象类对象,或者向上转型为该类的实现接口,都是可以的
四.接口的继承
接口可以继承接口,直接用一个例子来解释
Test03类实现了C接口,C接口继承了A,B接口,所以Test03类必须重写实现ABC全部接口
四.接口 抽象类 实现类的区别
- 普通类:具体实现
- 抽象类:具体实现,抽象方法
- 接口:抽象方法