Java_基础_final & 抽象类 & 接口

final

在这里插入图片描述

1.final修饰类,类不能被继承

final class A{0}
//class B extends A{}

2、final修饰方法,方法不能被重写了

class C{
public final void test(){}
}
class D extends C{
@Override
public void test() {
}

3、final可以修饰变量总规则:有且仅能赋值一次
变量:
一,局部变量
二,成员变量
------1、静态成员变量
------2、实例成员变量
在这里插入图片描述

常量

在这里插入图片描述

抽象类

在这里插入图片描述

抽象类的注意事项

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

抽象类的好处

在这里插入图片描述

模板方法设计模式

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

建议使用final关键字修饰模板方法,为什么?

  • 模板方法是给对象直接使用的,不能被子类重写。
  • 一旦子类重写了模板方法,模板方法就失效了。

接口

接口中除了有成员变量和成员方法外是不能有其他成员的。
接口里面定义的成员变量java默认是常量
接口里面定义成员方法java默认为抽象方法

在这里插入图片描述

接口的好处

在这里插入图片描述
在这里插入图片描述

要给一个对象赋更多的功能,只需要在这个对象所在的类里创建更多的方法就行了,为什么还需要实现接口,通过接口来获得方法呢?

参照现实生活,有的人会开车,但是没有驾驶证,别人是不知道你会开车的,也不会把你当作司机来用,代码同样如此,反应到程序里面,以Driver接口为例,A类implements Driver表明A类是有Driver这个功能的,A类就必须把Driver这个方法实现出来。在主程序里面就可以把A当作一个Driver来使用了

在这里插入图片描述

JDK8后的接口新特性

1、默认方法:必须使用default修饰,默认会被public修饰
实例方法:对象的方法,必须使用实现类的对象来访问。
2、私有方法:必须使用private修饰。(JDK 9开始才支持的)
实例方法:对象的方法。
3、静态方法:必须使用static修饰,默认会被public修饰

接口为什么都默认使用public修饰?
接口是要供别人使用的,所以是需要向外暴露的,因此接口里面的成员需要使用public进行修饰

JDK8之后为什么要新增加这些新特性呢?
之前的接口中只能定义常量和抽象方法,接口功能并不强大,JDK8之后新增加了带方法体的方法,相当于把接口功能增强了。
在这里插入图片描述
以前如果要扩展接口业务就必须新增加抽象方法,倘若继承该接口的实现类很多,那么每一个实现类都需要实现该抽象方法,繁琐且工作量大,因此扩展的带方法体的新特性就可以很好的规避,直接在方法体里面实现,简单且高效,更便于项目的扩展和维护。

在这里插入图片描述

接口的多继承

接口的多继承:一个接口可以继承多个接口

interface A{}
interface B{}
interface C{}
//接口是多继承的
interface D extends CBA{
}

class E implements C,B,A{
}
/等价于/
class E implements D{
}

接口是用来被类实现的,有一个实现类E需要同时实现3个接口,因此就需要在implements后面写上这3个接口的名字。但是由于接口是多继承的,因此就相当于把C,B,A,这3个接口合并成为了一个D接口,而实现类E只需要实现D接口就相当于实现类全部接口,这样就更便于实现类去实现接口的功能。

注意事项

1、一个接口继承多个接口,如果多个接口中存在方法签名冲突,则此时不支持多继承。

// 1、一个接口继承多个接口,如果多个接口中存在方法签名冲突,则此时不支持多继承。
interface I{
    void test1();
}
interface J{
    String test1();
}
//interface K extends I, J{
//}

2、一个类实现多个接口,如果多个接口中存在方法签名冲突,则此时不支持多实现。

// 2、一个类实现多个接口,如果多个接口中存在方法签名冲突,则此时不支持多实现。
interface I{
    void test1();
}
interface J{
    String test1();
}
//class E implements I, J{
//
//}

3,一个类继承了父类,又同时实现了接口,父类中和接口中有同名的默认方法,实现类会优先用父类的。

// 3、一个类继承了父类,又同时实现了接口,父类中和接口中有同名的默认方法,实现类会优先用父类的。
class Fu{
    public void run(){
        System.out.println("===父类的run方法执行了===");
    }
}
interface IT{
    default void run(){
        System.out.println("===接口IT中的run方法执行了===");
    }
}
class Zi extends Fu implements IT {

}

4.一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。

// 4、一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。
interface It1{
    default void test(){
        System.out.println("IT1");
    }
}

interface IT2{
    default void test(){
        System.out.println("IT2");
   }
}

class N implements It1, IT2{
   @Override
    public void test() {
        System.out.println("自己的");
    }
}
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值