java8学习(二)接口中新增的方法
- 在jdk1.8接口中可以写静态常量和抽象方法。
- jdk8之后对接口做了增加,接口中可以有默认方法和静态方法
interface 接口名{
静态常量;
抽象方法;
默认方法;
静态方法;
}
1、默认方法
1.1为什么要增加默认方法
JDK8以前接口中只能有抽象方法和静态常量,会存在以下的问题:
如果接口中新增抽象方法,那么实现类都必须要抽象这个抽象方法,非常不利于接口的扩展
public class Java8InterFaceDemo {
public static void main(String[] args) {
}
interface Test1 {
void A();
void B();
// 接口中新增抽象方法,所有实现类都需要重写这个方法,不利于接口的扩展
//即Test1Impl1 Test1Impl2 都需要重写此方法
}
class Test1Impl1 implements Test1{
@Override
public void A() {
}
@Override
public void B() {
}
}
class Test1Impl2 implements Test1{
@Override
public void A() {
}
@Override
public void B() {
}
}
}
1.2接口默认方法的格式
interface 接口名{
修饰符 default 返回值类型 方法名{
方法体;
}
}
public class Java8InterFaceDemo {
public static void main(String[] args) {
Test1 test1=new Test1Impl1();
Test1 test2=new Test1Impl2();
System.out.println("Test1Impl1调用默认方法:"+test1.C()+"\nTest1Impl2调用默认方法:"+test2.C());
}
interface Test1 {
void A();
void B();
// 接口中新增抽象方法,所有实现类都需要重写这个方法,不利于接口的扩展
//即Test1Impl1 Test1Impl2 都需要重写此方法
//默认方法C(),Test1Impl1 Test1Impl2 不需要
default int C(){
return 0;
}
}
static class Test1Impl1 implements Test1{
@Override
public void A() {
}
@Override
public void B() {
}
}
static class Test1Impl2 implements Test1{
@Override
public void A() {
}
@Override
public void B() {
}
@Override
public int C() {
return 100;
}
}
}
控制台输出:
Test1Impl1调用默认方法:0
Test1Impl2调用默认方法:100
2、静态方法
2.1静态方法语法规则:
interface 接口名{
修饰符 static 返回值类型 方法名{
方法体;
}
}
public class Java8InterFaceDemo {
public static void main(String[] args) {
// Test1 test1=new Test1Impl1();
// Test1 test2=new Test1Impl2();
// System.out.println("Test1Impl1调用默认方法:"+test1.C()+"\nTest1Impl2调用默认方法:"+test2.C());
System.out.println("调用静态方法:"+Test1.D());
}
interface Test1 {
void A();
void B();
// 接口中新增抽象方法,所有实现类都需要重写这个方法,不利于接口的扩展
//即Test1Impl1 Test1Impl2 都需要重写此方法
//默认方法C(),Test1Impl1 Test1Impl2 不需要
default int C(){
return 0;
}
//静态方法
static int D(){
return 10000;
}
}
static class Test1Impl1 implements Test1{
@Override
public void A() {
}
@Override
public void B() {
}
}
static class Test1Impl2 implements Test1{
@Override
public void A() {
}
@Override
public void B() {
}
@Override
public int C() {
return 100;
}
}
}
控制台输出:
调用静态方法:10000
2.1静态方法的使用:
接口中的静态方法在实现类中是不能被重写的,调用的话只能通过接口类型来实现: 接口名.静态方法名();
默认方法与静态方法对比:
- 默认方法通过实例调用,静态方法通过接口名调用
- 默认方法可以被继承,实现类可以直接调用接口默认方法,也可以重写接口默认方法
- 静态方法不能被继承,实现类不能重写接口的静态方法,只能使用接口名调用