接口
定义:接口从语法角度来说像是一种特殊的抽象类,两者都可以包含抽象方法且不能创建对象。接口是一种标准,通常用来约束其子类(实现类)应具备的功能
作用:降低程序间耦合,更自然的使用多态;在设计环节中使用接口定义标准,使开发更加灵活
1、接口的语法
1.1 接口语法和规定
- 语法:interface 接口名{}
- interface MyInterface{}
- 接口里面只允许有公开静态的常量和公开抽象的方法(jdk1.8以前)
- 接口里面所有不加访问修饰符的代表是公共的
- 普通的类,只能继承一个类;但是可以实现多个接口
- 实现多个接口,这个类必须重写所有接口里面的所有抽象方法
interface MyInterface{
//公开静态的常量
String NAME2 = "jack"; //默认在编译的时候,会添加上 public static final
public static final String NAME1 = "xqc";//推荐这么写
//公开抽象的方法
void test1();//默认会添加 public abstract void test1();
public abstract void test2();//推荐这么写
}
1.2 jdk1.8接口可以存在静态方法和默认方法;
Java 8 允许给接口添加一个非抽象的方法实现,只需要使用 default 关键字即可,这个特征又叫做扩展方法(也称为默认方法或虚拟扩展方法或防护方法)。在实现该接口时,该默认扩展方法在子类上可以直接使用,它的使用方式类似于抽象类中非抽象成员方法。
扩展方法不能够重写(也称复写或覆盖) Object 中的方法,却可以重载Object 中的方法。
如:toString、equals、 hashCode 不能在接口中被覆盖,却可以被重载。
默认方法允许我们在接口里添加新的方法,而不会破坏实现这个接口的已有类的兼容性,也就是说不会强迫实现接口的类实现默认方法。
默认方法和抽象方法的区别是抽象方法必须要被实现,默认方法不是。作为替代方式,接口可以提供一个默认的方法实现,所有这个接口的实现类都会通过继承得到这个方法(如果有需要也可以重写这个方法)
静态方法,通过static关键字修饰的方法;和普通类的静态方法调用方式一致
2、接口的规范
- 我们重写一个方法,修饰符一定是比重写之前的访问级别要高或者说一样
class A{
public void test(){ // default
}
}
class B extends A{
public void test(){ //重写的时候, public protected default private(错误的)
}
}
实现接口的方法,修饰符一定是public;[接口里面所有的抽象方法,默认都是public修饰符]
3、常见的关系
类/接口
3.1 类与类之间的关系;
可以是继承关系, extends来描述继承关系; 单继承
3.2 类与接口之间的关系;
是一个实现的关系; implements 某个类实现了多个接口; 多实现
语法: A implements IB1,IB2,IB3…{}
3.3 接口与接口之间的关系;
接口继承接口; extends关键字来描述;
IA extends IB1,IB2,IB3…{}
接口与接口之间继承的是什么东西 : 会将我们所有的属性,抽象方法全部通通继承过来.
代码:接口的多态、继承、引用、实现等
package com.qianfeng.xqc.day0226;
public interface IA {
public void a();
// jdk8可以允许有默认方法的存在,默认方法可以有方法主体;
// 理解为就是类里面的普通方法;
default void test2() {
System.out.println("接口里面的默认方法");
}
// jdk1.8 接口可以有静态方法; 全局唯一;使用方式: 接口名.方法名
public static void test() {
System.out.println("接口里面的静态方法");
}
}
package com.qianfeng.xqc.day0226;
public interface IB {
public void b();
}
package com.qianfeng.xqc.day0226;
public interface IC extends IA,IB {//接口继承接口
public void c();
}
package com.qianfeng.xqc.day0226;
public abstract class AD {
public abstract void d();
}
package com.qianfeng.xqc.day0226;
public class Impl1 extends AD implements IC {//继承抽象类AD,实现接口IC(IC继承接口IA和IB)
public void a() {System.out.println("IA接口");}//IA接口的方法,IC从IA继承过来的
public void b() {System.out.println("IB接口");}//IB接口的方法,IC从IB继承过来的
public void c() {System.out.println("IC接口");}//IC接口的方法
public void d() {System.out.println("AD抽象类");}//AD抽象类的方法
}
package com.qianfeng.xqc.day0226;
public class Impl2 extends AD implements IA,IB {
public void a() {System.out.println("IA接口");}//IA接口的方法
public void b() {System.out.println("IB接口");}//IB接口的方法
public void d() {System.out.println("AD抽象类");}//AD抽象类的方法
}
package com.qianfeng.xqc.day0226;
public abstract class AImpl extends AD implements IA {
//不实现抽象类和接口的方法,就将自己变成抽象类
}
package com.qianfeng.xqc.day0226;
public class Test {
// 接口的定义,接口的多态,单继承与多实现,接口与接口的继承
public static void main(String[] args) {
//多态 //Impl2继承抽象类AD,实现接口IA和IB
Impl2 impl = new Impl2();//继承抽象类AD,实现接口IA和IB
impl.a();
impl.b();
impl.d();
AD ad = impl;//只能实现抽象类AD的方法
ad.d();
IA ia = impl;//只能实现接口IA的方法
ia.a();
//调用接口里面的静态方法
IA.test();
//调用接口里面的默认方法
//接口里面的默认方法如何去访问 匿名内部类
new IA() {
public void a() {};
}.test2();
}
}
千锋杭州逆战201
2020.02.26