Java接口:小白如何初步认识Java接口?
1.接口的引入
在Java中,继承只能支持单继承,并不支持类的多重继承(也就是一个类不能继承多个父类),但在实际开发中,我们常常需要让一个类具备多种不同的行为,而不仅仅是单一继承所能提供的功能。
比如:Animal类中有能飞的(fly)、跑的(run)、游的(swim),其中Bird类只能飞,Dog类既可以跑又可以游,Duck类不仅能飞能跑,还能游。但是Duck类并不能同时继承飞、跑和游,此时该如何实现呢?
这时候该怎么解决呢?
此时就需要接口(Interface),接口是公共的行为规范标准,只要符合这个标准,那么就可以通用。
接口定义了一组方法规范,但不提供具体实现。也就是是这一定是一个抽象的方法,由实现该接口的方法来实现。
类可以实现(
implements
)多个接口,从而具备多种能力。
2.接口的语法
接口的定义和类的定义相似,类的定义用到的关键字是 class,而接口的定义需要用到关键字interface。具体定义如下:
public interface 接口名称 {
//抽象方法
public abstract void method1 ();//1
public void method2();//2
abstract void method3();//3
void method4;//4
}
其中,以上四个方法都是正确的,但在Java中,public abstract是默认搭配的,也就是说可以写也可不写,当方法中带有abstract时,它是一个抽象方法,也就是说,其实接口也可以理解为比抽象还要抽象一点的类,其方法是抽象方法,实现这个接口的方法必须重写这个抽象方法。并且在创建接口时,接口的名称一般以大写字母 I 开头。
Java中,子类和父类之间是 extends 实现继承关系,而类与接口之间用 implements 来实现。
比如定义了一个IFlying这个接口,Bird类想要实现这个接口,那么就可以有:
//动物类
public class Animal {public String name;public int age;public Animal(String name , int age) {this.name = name;this.age = age;}
}
//飞这个接口
public interface IFlying {void fly() ;
}
//鸟类,继承父类Animal,并实现IFlying接口
public class Bird extends Animal implements IFlying{public Bird(String name , int age) {super(name , age);}@Overridepublic void fly() {System.out.println(this.name + "正在飞来飞去!!!");}
}
//测试类
public class Main {public static void main(String[] args) {Bird bird = new Bird("愤怒的小鸟" , 5);bird.fly();}
}
3.接口的特性
3.1 接口类型是一种引用类型,但是不能new接口的对象
接口里面的方法是一个抽象方法,有抽象方法的一定是属于抽象类的范畴,自然就不能对其进行实例化。也就是说以下是错误的:
3.2 接口中的方法都默认是抽象方法,被 public abstract 所修饰,并且也只能被这个修饰,如果被其他的修饰符如 public 改成 protected ,则会报错
3.3 接口中的方法是抽象方法,所以它的方法体只能由实现接口的类来实现方法体
3.4 重写接口的方法时,不能使用默认的访问权限
接口的抽象方法默认是public修饰,因此在重写该方法时,要写上public修饰,如果不写,会默认是default访问权限修饰
3.5 接口中可以含有变量,但默认是 public static final 变量,也就是这个变量不能被修改
3.6 接口中不能有静态方法和构造方法
4.实现多个接口
认识接口后,在这里把本文开头引出接口的例子完整实现代码如下:
//动物类---父类
public class Animal {public String name;public int age;public Animal(String name , int age) {this.name = name;this.age = age;}
}
//可以飞的接口
public interface IFlying {void fly();
}
//可以跑的接口
public interface IRunning {void run();
}
public interface ISwimming {void swim();
}
//鸟类,既是子类,又是实现飞这个接口
public class Bird extends Animal implements IFlying{public Bird(String name , int age) {super(name , age);}@Overridepublic void fly() {System.out.println(this.name + "正在飞来飞去!!!");}
}
//狗类,既是子类,又是实现能跑能游这个接口
public class Dog extends Animal implements IRunning,ISwimming{public Dog(String name , int age) {super(name , age);}@Overridepublic void run() {System.out.println(this.name + "正在跑来跑去!!!");}@Overridepublic void swim() {System.out.println(this.name + "正在游来游去!!!");}
}
//鸭类,既是子类,又是实现能跑能游能飞这个接口
public class Duck extends Animal implements IRunning,ISwimming,IFlying {public Duck(String name , int age) {super(name , age);}@Overridepublic void fly() {System.out.println(this.name + "正在飞来飞去!!!");}@Overridepublic void run() {System.out.println(this.name + "正在跑来跑去!!!");}@Overridepublic void swim() {System.out.println(this.name + "正在游来游去!!!");}
}
以上代码展示了Java作为面向对象的编程中最常见的用法:一个类虽然只能继承一个父类,但可以同时实现多个接口。
在Java中,类和类是单继承的,一个类可以实现多个接口,所以使用接口就可以达到多继承的目的。
当这样写代码后,在以后重新写某个类(可以不是Animal类)时,也可以直接调用该类所具有的行为。
5. 抽象类和接口的区别
核心区别:抽象类中可以包含普通方法和普通字段,可以被子类直接使用(不需要重写),而接口中不能包含普通方法,子类必须重写所有的抽象方法。