Java进阶04 final关键字、abstract抽象、interface接口、JDK8与JDK9中接口的区别、内部类和匿名类

一、final关键字

final可以修饰类、方法、变量

用final修饰类 表示此类不能被继承
用final修饰方法 表示方法不可以被重写
用final修饰变量 既可以修饰成员变量也可以修饰局部变量,代表着此时的变量变成了常量,一旦赋值,无法修改
定义的时候必须要指定初始值

final和static进行搭配
俩个合在一起修饰成员变量的时候就称为此成员变量是全局常量

二、abstract关键字

包含抽象方法的类一定是抽象类
抽象方法就是没有方法体的方法

抽象类不能实例化,抽象类中包含构造器的,子类对象实例化需要直接或间接调用父类的构造器的
抽象类中可以没有抽象方法,但是抽象方法一定要在抽象类中

抽象方法只有方法的声明没有方法体
抽象方法的功能是确定的,只是不知道如何具体实现
子类必须重写父类的所有抽象方法之后,才可以使用,否则这个子类依然是个抽象类

不能用abstract修饰私有方法、静态方法、final修饰的方法、final修饰的类

三、接口interface

接口的本质是契约、标准、规范,就像法律一样,人人都要遵守

接口的内部可以声明属性,但是必须使用public ststic final 修饰 默认的 可以省略

也可以声明方法,jdk8之前修饰为public abstract 也是默认的可以省略
jdk8声明静态方法、默认方法
jdk9声明私有方法

不可以声明构造器和代码块

接口和类之间是实现关系
类可以实现多个接口
类针对接口的多实现,一定程度上就弥补了类的单继承的局限性
类必须将实现的接口的抽象方法全部都重写,才可以实例化,否则必须标为抽象类

接口和接口之间可以有继承关系,而且可以多继承

接口具有多态性
接口名 变量名 = new 实现类对象
多态性演示实例

package org.example;

public class UsbTest {
    public static void main(String[] args) {
        Computer computer = new Computer();
        USB usb=new Printer();
        computer.transferData(usb);

    }
}
class Computer{
    public void transferData(USB usb){
        System.out.println("设备连接成功");
        usb.start();
        System.out.println("数据传输");
        usb.stop();
    }
}

class Printer implements USB{

    public void start() {
        System.out.println("打印机开始打印");
    }

    public void stop() {
        System.out.println("打印机停止打印");
    }
}

interface USB{
    void start();
    void stop();
}

抽象类和接口的区别

相同点:
都可以声明抽象方法
都不能实例化

不同点:
抽象类一定有构造器,接口没有构造器
类与类之间是继承关系,接口与类之间是实现关系,接口与接口之间是多继承关系

如果抽象类和接口都可以使用的话,优先用接口,避免单继承的局限性

四、JDK8和JDK9中接口的区别

1、接口中声明的静态方法只能被接口来调用,不能使用实现类调用
2、接口中声明的默认方法,可以被实现类继承,实现类在没有重写此方法的情况下,默认调用接口中声明的默认方法,如果重写了则调用重写的方法
默认方法用default修饰
public default void method(){
]
3、类实现了两个接口,而两个接口中定义了同名同参数的默认方法,则实现类没有重写此两个接口默认方法的情况下报错,必须要重写同名同参数的方法
4、子类继承了父类并实现了接口,父类和接口中声明了同名同参数的方法,其中接口中的方法是默认的方法,默认情况下子类在没有重写此方法的情况下调用的是父类中的方法(类优先原则)
5、如何在子类中调用父类或接口中被重写的方法,直接用函数名调用

JDK9中可以定义私有方法,私有方法实现类看不到也用不了,就是只能给自己用

五、内部类

内部类就是A定义在类B里面,A就是内部类,B就是外部类
使用内部类遵循了高内聚低耦合的开发原则

常用的例子,Thread类内部声明了State类,表示线程的生命周期
HashMap类中声明了Node类,表示封装的key和value

内部类的分类:
成员内部类:直接声明在外部类的里面,使用static修饰的是静态的成员内部类,没使用就是非静态的成员内部类

局部内部类:声明在方法内、构造器内、代码块内的内部类,分为匿名的局部内部类和非匿名的局部内部类

内部类的内部可以声明属性、方法、构造器、代码块、内部类等结构
内部类可以声明父类也可以实现接口
可以使用final修饰 可以使用abstract修饰

对于外部类而言,内部可以调用外部类的结构,比如属性、方法等
除了使用public修饰、缺省权限修饰外,还可以用private protected修饰
可以使用static修饰
用Person.this.name调用外部类的相同变量名的变量

加了大括号代表的是继承于该类的一个子类

		//匿名类
        new Object() {
            public void test() {
                System.out.println("hello");
            }
        }.test();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值