18、java的接口和接口与抽象类的区别(jdk8.0后的静态方法、默认方法)

接口

关键字:interface
接口中所有的属性都是公开静态常量,默认被public static final修饰
接口中所有的方法都是公开抽象方法,默认被public abstract修饰
接口中没有构造方法,不能参与创建对象的过程。

interface Inter{
void m1();
void m2();
}
//实现类1,实现接口可以不用实现所有方法,则是抽象类
abstract class MyInter1 implements MyInter{}
//实现类2,实现所有方法则不是抽象类
class MyInter2 implements MyInter{
public void m1(){}
public void m2(){}
}

接口与抽象类的异同点

相同点:

  1. 编译之后都能生成字节码文件(.class文件)
  2. 不能创建对象
  3. 可以声明为引用

不同点:

  1. 接口中所有的属性都是公开静态常量,默认被public static final修饰;抽象类没有要求
  2. 接口中所有的方法都是公开抽象方法,默认被public abstract修饰;抽象类没有要求
  3. 接口中没有构造方法,静态、动态代码块;抽象类可以存在
  4. 接口是多继承,抽象类是单继承。

接口新语法

1.在JDK8.0以后,接口中允许存在静态方法:

语法:public static 返回值类型  方法名(参数表){
//方法实现
}
调用:接口名.静态方法名(实参);

2. JDK8.0以后,接口中可以定义默认方法:

语法:public default 返回值类型  方法名(参数表){
   //方法的实现
}

作用: 保证接口的向后兼容性,即接口定义之后,可能存在多个实现类,如果随意更改接口中的方法,则每一个实现类都必须修改,不利于代码的维护,如果设置成默认方法则不影响。
注意: 如果一个类同时实现了两个接口,并且两个接口中存在相同声明的两个默认方法,结果编译报错。
解决方式: 实现类覆盖接口中的默认方法。
如果想要访问接口中的同名的默认方法,可以使用接口名.super.方法名()的方式访问。

interface IA{
	void m1();
	public default void m2(){
		System.out.println("IA default m2().....");
	}
}
interface IB{
	default void m2(){
		System.out.println("IB default m2().....");
	}
}
class ClassE{
	public void mm(){}
}
class MyClass extends ClassE implements IA,IB{
	public void m1(){}
	public void m2(){
		IA.super.m2();//多继承的复杂性造成的
		IB.super.m2();
		System.out.println("MyClass m2().....");
	}
	public void mm(){
		super.mm();//调用父类的mm()
		System.out.println("MyClass mm()");
	}
}

接口与抽象类不同点

抽象类接口
关键字abstract(extends)interface(implements)
属性实例变量、静态变量 4个访问修饰符随意公开静态常量
方法抽象方法、普通成员方法抽象方法、静态方法(JDK8.0)、默认方法(JDK8.0)、私有方法(JDK9.0)
构造方法有构造方法没有构造方法
继承关系单继承多继承

接口的分类

  1. 标记接口:空接口,接口中没有任何的属性和方法
  2. 常量接口:接口中只有常量,没有任何的方法
  3. 函数式接口:接口中只有一个抽象方法
  4. 普通接口:至少有2个以上的抽象方法的接口
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值