46.接口
当一个抽象类,如果抽象类中的所有方法都是抽象的,那么我们就可以把它定义为一个接口,接口是对行为的抽象。类是对属性和行为的抽象。
语法
interface 接口名{
方法定的定义;
….
}
(1)接口的特征:
1.接口中的方法的定义不需要Abstract来修饰,默认就是抽象的
2.不可以实例化的,需要有类来实现接口,实现接口的语法:
class 类名 implements 接口名,接口名,…{
//实现每一个接口中的方法
}
3.接口中的方法不能和private,static和final共存,
4.在接口中可以定义”属性”,可以通过接口的实现类的实例来访问(不推荐),推荐使用接口名.常量,这是一个常量默认是public, static ,final,属性不能修改
注意:常量的定义命名的规范要使用大写,单词之间要用“_”分隔。
5.接口可以继承接口,多级继承或者多继承,interface C extends A,B{},继承的接口中重复的方法会合并
interface May{
public static final double IP=3.14;
//Abstract来修饰,默认就是抽象的
public void marry();
}
interface April{
public void met();
}
//接口可以多继承接口
interface June extends May,April{
public void givebirth();
}
//类的实现可以实现多个
class Cal implements May,April{
int r;
public static void main(String[] args){
Cal c=new Cal();
c.r=5;
//调用接口中的方法可以用实现接口的类的实例对象来调用也可以用接口调用,推荐后者
System.out.println(5*5*c.IP);
}
//实现接口的类中要实现接口的每一个方法
public void marry(){
}
public void met(){
}
}
(2)接口的应用
例子:正方形和圆的周长和面积
interface Sp{
double IP=3.14;
//抽象计算周长的方法
public double getLong();
//抽象计算面积的方法
public double getArea();
}
//定义一个Rect类实现Sp的方法
class Rect implements Sp{
int r;
public double getLong(){
return 4*r;
}
public double getArea(){
return r*r;
}
public Rect(int r){
this.r=r;
}
}
//定义一个Circle类实现Sp中的方法
class Circle{
int r;
public double getLong(){
return 2*r*Sp.IP;
}
public double getArea(){
return r*r*Sp.IP;
}
public Circle(int r){
this.r=r;
}
}
public class Calculate{
public static void main(String[] args){
Rect a=new Rect(4);
Circle b=new Circle(10);
System.out.println("正方形的周长是"+a.getLong()+"\t正方形的面积是"+a.getArea());
System.out.println("圆的周长是"+b.getLong()+"\t圆的面积是"+b.getArea());
}
}
注意:容易出现的问题忘记写主方法,调用方法忘记加括号,单词写错
(3)接口在JDK1.8中的特性
第一点:静态方法——接口在JDK1.8及之后的版本可以有静态方法
interface A{
//接口中定义一个静态方法,可以在其他类中直接调用这个方法语法:接口名.静态方法名(引用),但是这个方法必须是public static
public static void printArr(int[] arr){
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
}
}
//创建一个类调用接口中的静态方法,这个类可以实现接口也可以不实现,可以是主类也可以不是主类
class Jdk1{
public static void main(String[] args){
//创建一个数组
int[] arr=new int[]{1,2,3,4,5,6};
//调用静态方法打印数组
A.printArr(arr);
}
}
第二点:默认方法——接口在JDK1.8及之后的版本定义默认方法(default)
接口中的默认方法可以在实现该接口的类中不写出来,默认可以实现调用,如果类中实现了,创建该类的对象优先调用类中实现的方法
interface A2{
//创建一个方法权限修饰符后面跟着default,注意default和static不能同时存在,这个方法是默认方法
public default void sleep(){
System.out.print("调用默认方法");
}
}
//创建一个类实现接口
public class Jdk2 implements A2{
public static void main(String[] args){
Jdk2 j=new Jdk2();
//调用在实现接口的类中默认实现的方法
j.sleep();
}
}
(4)实现接口的好处
1. 接口定义的是一种标准,可以使代码分层开发,分模块开发。
2. 降低代码的耦合度,提高代码的可扩展性和可维护性
3. 接口改进了单继承的局限。
(5)接口和抽象类的区别:
1.接口是行为的抽象可以有静态方法,抽象方法和默认方法,抽象类中可以有所有方法。
2.接口和抽象类都不能实例化,接口需要类来实现后实例化实现类,抽象类需要类来继承然后实例化子类。
3.抽象类只能单继承,接口可以多继承接口(jdk1.7),接口还可以多实现。
4.接口中的“属性”是public static final类型的,抽象类中的属性跟普通类中的属性没有区别。
5.接口中的方法默认就是抽象的不需要加absract,抽象类中的抽象方法需要加abstract关键字。