Java8接口新特性

概述:

1、Java8之前接口定义:只可以定义抽象方法,不能定义非抽象方法的特殊类型
2、Java8接口的定义:即可以定义抽象方法,也可以定义非抽象方法
如果需要定义非抽象方法,那么当前方法需要使用static或者default修饰
3、改变的原因:
改变之前:如果定义了一个接口,接口已经参与使用,后续想给接口增加一个功能,只能添加抽象方法,但是接口已经在使用,新增一个抽象方法之后,使用过该接口的类型就报错。
改变之后:   为了保证接口可以新增功能,要保证使用过接口的类型不出问题,jdk1.8之 后接口就重新定义:
接口中既可以定义抽象方法也可以定义非抽象特殊方法。

default修饰的方法

1、定义方式:

直接在在修饰符位置上加上default关键字即可

2、注意事项:

(1)如果某个类型实现两个接口,两个接口中定义了两个相同方法声明的抽象方法, 那么该实现类只需要重写其中一个即可。

(2)如果某个类型实现两个接口,两个接口中定义了两个相同方法声明,不同方法实 现的非抽象方法,那么该实现类必须强制重写或者只能继承其中一个,不能同时继承两个。
强制继承方式:接口名.super.方法名();

(3)如果某个类型即继承一个父类,又实现一个接口,父类和接口中有两个相同的方法声明,不同的实现内容的方法;该类可以选择默认继承父类的方法,或者强制继承接口的方法。               强制继承方式:接口名.super.方法名();

package com.demos;

/**
 * @Author lss
 * @CreateTime 2023/8/17
 * @Description
 */
public class Demo02_jdk8接口 {
    public static void main(String[] args) {
        Inter inter = new InterImpl();
        inter.test();
        inter.test1();
        System.out.println("-------------");
        InterImpl1 interImpl1 = new InterImpl1();
        interImpl1.test1();
    }
}
interface Inter{
    void test();
    public default void test1(){
        System.out.println("Inter test running....");
    }
}
interface Inter1{
    void test();
    public default void test1(){
        System.out.println("Inter1 test running....");
    }
}
class InterImpl implements Inter,Inter1{

    @Override
    public void test() {
        System.out.println("test running.....");
    }

    @Override
    public void test1() {
        //同时实现了两个接口,两个接口有相同的方法声明的非抽象方法
        //对于实现类来说 必须重写一个
        //重写的格式:
        // 接口名.super.非抽象方法()
        Inter.super.test1();
       // Inter1.super.test1();
    }
}
class Fu{
    public void test1(){
        System.out.println("fu test1 running......");
    }
}
class InterImpl1 extends  Fu implements Inter{

    @Override
    public void test() {
        System.out.println("InterImpl1 test......");
    }

    /**
     * 一个类继承了父类,同时实现了一个接口
     *  父类和接口中都定义了相同的非抽象方法
     *  默认是使用父类的非抽象方法
     *  如果要使用接口的非抽象方法 需要强制重写:
     *  接口.super.非抽象方法()
     */
    @Override
    public void test1() {
        Inter.super.test1();
    }
}
总结:

jdk8 可以定义抽象方法 也可以定义非抽象方法 需要加static或者default关键
* 实现了一个接口 实现类可以直接使用接口的非抽象方法,不需要强制重写
* 实现了两个接口(两个接口都定义了相同的非抽象方法)
* 实现类必须要重写非抽象方法,必须要选择执行一个接口的非抽象方法
* 接口名.super.方法名
*继承了一个类实现了一个接口(父类和接口都定义了相同的非抽象方法)
* 默认 是使用父类的方法
* 也可以强制重写接口的非抽象方法

static修饰的方法

1、父类中定义的静态方法可以被子类继承,但是不能被重写

2、接口中定义的静态方法,实现类不能继承

package com.demos;

public class 接口的静态方法 {
    public static void main(String[] args) {
        Zi1 zi1 = new Zi1();
        //1、子类可以继承父类的静态方法 但不能没法重写父类的静态方法
        //2、接口定义的静态方法,实现类不能继承
        zi1.test01();
    }
}
class Fu1{
    public static void test01(){
        System.out.println("Fu1的静态方法");
    }
}
interface Inter2{
    public static  void  test2(){
        System.out.println("Inter2静态方法");
    }
}
class Zi1 extends  Fu1 implements  Inter2{

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值