接口(Interface)是一种特殊的抽象类,接口里面的属性都是public static final修饰的,接口里的方法都是public abstract修饰的。
接口使用关键字interface来定义,使用implements表示实现接口,例如:
public interface MyInterface{
int num = 100; //等同于:public static final int num = 100;
public void fn();//等同于:public abstract void fn();
//JDK8及以后,允许我们在接口中定义static方法和default方法。
// static修饰符定义静态方法
static void staticMethod() {
System.out.println("接口中的静态方法");
}
// default修饰符定义默认方法
default void defaultMethod() {
System.out.println("接口中的默认方法");
}
}
class A implements MyInterface{
@Override
public void fn(){
MyInterface.staticMethod();
System.out.println("fn()....");
this.defaultMethod();
}
public static void main(String[] args) {
new A().fn();
}
}
1)Java中一个类有且只有一个父类,但是一个类可以实现多个接口。
2)接口不能实例化,只能实例化接口的实现类。
3)接口允许多重继承。
4)接口没有构造方法。
5)接口里面的属性都是public static final修饰的,接口里的方法都是public abstract修饰的。
6)接口侧重于表示事物的功能。表达了xxx has a xxx 的概念。
抽象类侧重描述事物的本质,表达了xxx is a xxx的概念。 接口侧重于表示事物的功能。表达了xxx has a xxx 的概念。
比如:
保温杯是水杯,有保温的功能。所以水杯是抽象类,保温是接口。 伪代码描述为:class 保温杯 extends 水杯 implements 保温
防盗门是门,有防盗功能。所以门是抽象类,防盗是接口。 伪代码描述为:class 防盗门 extends 门 implements 防盗 ...
我们通过一个综合实例来深入理解抽象类和接口的区别。
我们分别设计了动物、小猫、小狗、小鸭、老鼠类。 分析得到,小狗、小猫、小鸭、老鼠都是动物,所以动物应该设计为抽象类。小猫和小狗都有捉耗子的本领,所以让小狗和小猫都去实现捉耗子接口,而小鸭和小狗都有游泳的本领,所以让小狗和小鸭都去实现游泳的接口。

实现代码如下:
//动物是抽象类
public abstract class Animal {
String gender;
String alias;
int age;
int speed; //奔跑速度。
public Animal() {
}
public Animal(String gender, String alias, int age, int speed) {
this.gender = gender;
this.alias = alias;
this.age = age;
this.speed = speed;
}
public abstract void bark(); //动物叫方法也是抽象方法。
}
//捉耗子的接口
public interface CatchMouse {
public boolean catchMouse(Mouse m);
}
//游泳接口
public interface Swim {
public void swim();
}
//小狗类分别实现了捉耗子和游泳接口
public class Dog extends Animal implements CatchMouse,Swim {
public Dog() {
}
public Dog(String gender, String alias, int age, int speed) {
super(gender, alias, age, speed);
}
@Override
public boolean catchMouse(Mouse m) {
if(this.speed>m.speed){ //能否捉到老鼠取决于速度
return true;
}
return false;
}
@Override
public void swim() {
System.out.println("我会狗刨,我也会游泳...");
}
@Override
public void bark() {
System.out.println("汪汪..");
}
}
//小猫类实现了捉耗子接口
public class Cat extends Animal implements CatchMouse {
public Cat() {
}
public Cat(String gender, String alias, int age, int speed) {
super(gender, alias, age, speed);
}
@Override
public boolean catchMouse(Mouse m) {
if(this.speed>m.speed){ //能否捉到老鼠取决于速度
return true;
}
return false;
}
@Override
public void bark() {
System.out.println("喵喵...");
}
}
//小鸭类实现了游泳接口
public class Duck extends Animal implements Swim{
public Duck() {
}
public Duck(String gender, String alias, int age, int speed) {
super(gender, alias, age, speed);
}
@Override
public void swim() {
System.out.println("我是天生的游泳健将...");
}
@Override
public void bark() {
System.out.println("嘎嘎...");
}
}
//老鼠类
public class Mouse extends Animal {
public Mouse() {
}
public Mouse(String gender, String alias, int age, int speed) {
super(gender, alias, age, speed);
}
@Override
public void bark() {
System.out.println("吱吱...");
}
}
//测试类
public class Test {
public static void main(String[] args) {
Animal dog = new Dog("公","旺财",3,100);
Animal cat = new Cat("母","Tom",5,200);
Animal duck = new Duck("母","唐纳德",4,50);
Animal mouse = new Mouse("公","Jerry",3,120);
dog.bark();
cat.bark();
if(((Dog) dog).catchMouse((Mouse)mouse)){
System.out.println("狗狗捉到了老鼠");
}else{
System.out.println("狗狗放走了老鼠");
}
if(((Cat) cat).catchMouse((Mouse)mouse)){
System.out.println("Tom捉到了老鼠");
}else{
System.out.println("Tom放走了老鼠");
}
((Dog) dog).swim();
((Duck) duck).swim();
}
}
运行结果:
汪汪..
喵喵...
狗狗放走了老鼠
Tom捉到了老鼠
我会狗刨,我也会游泳...
我是天生的游泳健将...
1)Java中一个类有且只有一个父类,但是一个类可以实现多个接口。
2)接口不能实例化,只能实例化接口的实现类。
3)接口允许多重继承。
4)接口没有构造方法。
5)接口里面的属性都是public static final修饰的,接口里的方法都是public abstract修饰的。
6)接口侧重于表示事物的功能。表达了xxx has a xxx 的概念。
7)接口的实现类必须实现接口里的所有方法这也是多态性的表现