简介:接口(interface),在java当中是一个抽象方法的集合体,一个类通常通过来继承接口,从而实现接口当中所有的实现类
接口跟类,并不相同,是两个不同的概念,接口的实现往往需要借助于实现类,从而达成目的,在实现的时候,除非是一个抽象的类,否则
就要对于接口当中的所有方法,进行重新的定义.而类只是用来描述对象的属性以及相应的方法
1>接口与类的区别:
一: 接口通常都是不能实例化的,要想进行实现,就需要有实现接口的存在,实现类的存在, 重新定义接口当中所有的方法
二: 接口是没有构造方法的
三: 接口当中所有的方法都只能是抽象的方法:在抽象方法的基础上,前面的public abstract都已经被隐藏,省略,所以我们可以直接构造 void+
相应的方法名称即可;
注!:在java1.8当中,接口被设计的可以进行构造默认方法,以及静态默认方法(原因:有时候需要对于接口进行更新换代,进行升级,但是如果在接口当中再次
构建一个新的抽象方法,那么之后接口的实现类都要进行对于这个方法的重写,比较麻烦,我们选择可以直接在这个接口内部直接构建这个更新过后的方法,能够被
直接的调用,这就是默认方法,以及静态方法的创造原因){
1.默认方法(默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法)
public interface Vehicle { default void print(){ System.out.println("奥力给,干了兄弟们!"); } }
默认方法当中的一些冲突:存在有两个不同的接口,但是这两个接口当中都有相同的默认方法,连带名称都一样
for example: 1: public interface Vehicle { default void print(){ System.out.println("我是一辆车!"); } }
public interface Accent { default void print(){ System.out.println("我是一辆大卡车!"); } }
方法1:如果要进行调用,我们可以自己构建一个方法,实现其中我们要进行使用的具体方法,对其进行重写
public vehicle implacements Vehicle { public static void print(){ super();//在这里会自动的调用,所以是可以直接的省略 System.out.println("我才不是车!"); } }
方法2:第二种,我们也可以都进行继承,最后选择相应自己需要的进行调用:
(在接口当中,是允许有一个子类都进行实现多个不同的接口的)
Vehicle.draw();就可以直接进行调用,不再进行重写 public interface Vehicle { default void print(){ System.out.println("我是一辆车!"); } static void draw(){ System.out.println("我天生喜欢美的东西"); } } }
四:接口当中不能定义成员变量(除了 static 以及 final类型的)
五:接口并不是要被继承,而是将要被"实现"
六:接口是支持多继承的(一个儿子爹只能有一个(继承只能一对一),但是干爹可以有好多个(干爹指的就是接口))
2>接口特性:
1.接口当中的方法都是一个隐藏的抽象方法,在方法名称前面隐藏了 public abstract 所以规定方法的时候,直接
用void+方法名();就可以
2.接口当中可以存在有变量,成员变量也可以有,但是都已经在前面隐藏了,public static final 变量
3.接口当中的类在接口当中无法进行实现,只能够通过实现接口的类来进行重写(java8的默认方法以及静态方法除外,以及java9的一些新加特性)
3>抽象类和接口类的不同之处:
1. 抽象类中的方法可以有方法体,就是能实现方法的"具体功能"但是接口中的方法不行。
(方法体就是在大括号当中加入一些java的具体代码块, 进行对于代码的实现, 接口当中定义的抽象方法必须要外部的实现类全部都进行重写才行)
2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。(并且在接口当中是进行隐藏的)
3. 接口中不能含有 ""静态代码块"" 以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
tips:静态代码块(随着类的加载而进行,并且只执行一次,之后进入回收站!)
是什么?
静态代码块:执行优先级高于非静态的初始化块,它会在类初始化的时候执行一次,执行完成便""销毁"",它仅能初始化类变量,即static修饰的数据成员。
static{ }
***意义就是不需要每一次的调用都给其进行初始化
同时,还存在有非静态代码块:
{
}
***在每一次创建对象的时候都会被调用一次
如何用?
在静态代码块的中间加入需要写的代码即可
4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
5.抽象类当中可以有构造方法, 但是接口当中是不可以存在构造方法的
(因为接口本身就是用来声明一种行为规范的, 按照定制的方法, 你需要对其进行执行, 不执行, 就是错误! "构造方法" 是用来在对象初始化前对对象进行一些预处理的,提供了实例化一个具体东西的入口。接口只是声明而已,不一定要进行什么初始化,就算要进行初始化,也可以到实现接口的那一些类里面去初始化。)
}