• 【第一阶段:java基础】第8章:面向对象编程高级-2(P394-P423)final、抽象类、接口、内部类


     本系列博客是韩顺平老师java基础课的课程笔记,吐血推荐的一套全网最细java教程,获益匪浅 韩顺平java课程

    目录(P394-P423)

    1 final

    2 抽象类

    3 接口

    4 内部类

    1️⃣ 局部内部类

    2️⃣🍓匿名内部类

    3️⃣成员内部类

    4️⃣静态内部类


    1 final

    • 基本介绍
      • final可以修饰类 属性 方法 和局部变量
      • 当不希望类被继承时,可以用final修饰
      • 当不希望父类的某个方法被覆盖/重写时,可以使用final修饰方法
      • 当不希望父类的某个属性值被修改时,可以使用final修饰该属性
        public final double fax=0.08
      • 当不希望某个局部变量(方法中的变量)被修改时,可以使用final修饰该局部变量
    • 使用细节
      • final修饰的属性又叫做常量,一般用XX_XX_XX来命名
      • final修饰的属性在定义时,必须赋值,并且以后不能修改,赋值可以在如下位置之一:1. 定义时,2. 构造器中 3. 代码块中
      • 如果final修饰的属性是静态的,则初始化的位置执行是在1.定义时 2. 静态代码块中,不能在构造器中赋值
        因为final修饰的静态变量在类加载的时候就需要初始化,而构造器是在类加载时下运行的
      • final类不可以继承,但是可以实例化对象
      • 一般来说,如果一个类已经是final类了,就没有必要将该方法修饰成final方法
      • final方法不能修饰构造器
      • final和static一般搭配使用,效率更高,不会导致类的加载,底层编译器做了优化处理
      • 包装类(interger double float boolean)等都是final ,string也是final

    2 抽象类

    • 问题引入
      • 父类方法不确定性:当父类的某些方法需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,这个类对应的就是抽象类
      • 抽象方法是没有实现的方法(方法中没有方法体)
    • 介绍
      • 当一个类中存在抽象方法时,必须将这个方法声明为抽象类
      • 抽象方法没有方法体
      • abstract class animal{abstract public void eat();}
      • 一般来说,抽象类会被继承,由子类来实现
      • 抽象类的价值更多的在于设计,设计者设计好之后,子类继承并实现抽象类(是考官比较爱问的知识点,在框架和设计模式中使用较多)
    • 细节
      • 抽象类不能实例化
      • 抽象类不一定包含抽象方法
      • 一旦类包含了抽象方法,就必须将这个类声明为abstract
      • abstract 只能修饰类和方法,不能修饰属性和其他
      • 抽象类可以有任意成员(抽象类的本质还是类)
      • 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非他自己也声明为abstract类
      • 抽象方法不能使用private final static 来修饰,因为这些关键字都是和重写相违背的
    • 抽象类的应用:模板设计模式

    3 接口

    • 基本介绍
      • 定义
        • 接口就是给出一些没有实现的方法,等到某个类使用的时候,再根据具体情况吧这些方法写出来
      • 语法
        • interface 接口名{属性,方法}
        • class 类名 implements 接口{自己的属性,自己的方法,必须实现的接口的所有抽象方法}
      • 小结
        • 在jdk7.0以前,接口中的所有方法都没有方法体,即全部都是抽象方法
        • jdk8.0以后,接口中可以有静态方法,默认方法(用default关键字修饰),也就是说接口中可以有方法的具体实现
    • 细节
      • 接口不能被实例化
      • 接口中的所有属性必须是static final的,也就是静态不能被修改的属性 
      • 接口中的所有方法默认是public abstract的(可以省略abstract关键字)
      • 接口不能继承别的类,但是可以继承多个别的接口
      • 一个普通类实现接口,就必须将接口中的所有方法都实现,可以使用alt+enter快捷键来批处理
      • 抽象类实现接口,可以不用实现接口的方法(因为抽象类中允许抽象方法存在)
      • 一个类可以同时实现多个接口
      • 接口的修饰符只能是public和默认,这一点和类的修饰符是一样的
      • 接口中的属性,只能是final的,并且是public static final 修饰的。比如受int a=1 实际上是public static final int a=1
      • 接口中属性的访问形式是 接口名.属性名
    • 接口实现 VS 继承
      • 理解
        • 可以将接口理解为对继承机制的一种补充
        • 小猴子和老猴子之间是继承关系,但是如果小猴子想拥有小鸟的飞翔能力,就应该向小鸟学习,实现它的飞翔功能。(先天拥有和后天学习的区别)
        • 当子类继承了父类就自动拥有了父类的功能,如果子类需要扩展功能,可以通过实现接口的方式进行扩展
      • 小结
        • 接口和继承解决的问题不同
          • 继承的价值在于:解决代码的复用性和可维护性
          • 接口的价值在于:设计好各种规范,让其他类去实现这些方法
        • 接口比继承更加灵活
          • 继承必须满足is-a的关系,但是接口只需要满足like-a的关系即可
          • 接口在一定程度上实现了代码的解耦 (即 接口的规范性+动态绑定)
    • 接口多态特性
      • 多态参数
        • 在老师给的案例中,接口类型的形参,既可以接受手机对象,也可以接收相继对象(只要是实现了接口的类都可以接受)
        • 接口类型的变量,可以指向实现了该接口的对象实例(类似于继承关系中的向上转型)
      • 多态数组
        • 一个USB(接口)数组中,既可以接收手机对象,也可以接收相机对象(接口数组中能存放实现了该接口的类的对象实例)
      • 多态的传递性
        • (可以将接口实现类比与继承关系)
      • 小结

    4 内部类

    • 基本介绍
      • 一个类的内部又完整地嵌套了另一个类结构,被嵌套的类称为内部类,嵌套其他类的类称为外部类。是类的五大成员之一。内部类最大的特点是可以直接访问私有属性,并且可以体现类与类之间的包含关系。
      • 类的五大成员:属性 方法 构造器 代码块 内部类
      • 使用场景:当只想用一次某一个类,下一次不想再用时
    • 基本语法
    • 内部类分类
      • 定义在外部类局部位置上(比如方法内)
        • 1️⃣ 局部内部类(有类名)
        • 2️⃣ 匿名内部类(没有类名,重点🍓💥💥)
      • 定义在外部类的成员位置上(属性或者方法位置)
        • 3️⃣ 成员内部类(没有static修饰)
        • 4️⃣ 静态内部类(有static修饰)
    • 1️⃣ 局部内部类

      • 🍓定义在外部类的局部位置上(通常是在方法中或者代码块中),并且有类名

      • 局部内部类可以访问外部类的所有成员,包括私有的
      • 不能添加访问修饰符,因为它的地位就是一个局部变量。局部变量是不能使用修饰符的,但是可以使用final修饰,因为局部变量也可以使用final。加上final之后,说明这个内部类是不能被其他类继承的。(补充:局部内部类也是可以用abstract修饰的)
      • 🍓作用域:仅仅在定义它的方法或者代码块中
      • 局部内部类访问外部类的成员:直接访问
      • 外部类访问局部类的成员:在方法中创建内部类对象,再访问
      • 外部其他类不能访问局部内部类(因为局部内部类的低位是一个局部变量)
      • 如果外部类和局部内部类的成员重名时,内部类访问成员默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问

    • 2️⃣🍓匿名内部类

      • 基本介绍
        • 匿名内部类是定义在外部类的局部位置,比如说方法中,并且没有类名的一种类
      • 基本语法
      • 基于接口
        • tiger的编译类型是接口,运行类型就是匿名内部类。jdk在底层创建了匿名内部类之后,立即创建了匿名实例,并且把地址返回给tiger
        • 匿名内部类使用一次就不能再继续使用了(但是创建过的对象引用是可以继续再使用的)
      • 基于类
      • 细节
        • 匿名内部类既是一个类的定义,同时本身也是一个对象,因此从语法上看,它既有定义类的特征,也有创建对象的特征。
        • 不能直接访问外部类的所有成员,包括私有的
        • 不能添加类的访问修饰符,因为它的地位就是一个局部变量
        • 作用域:仅仅在定义它的方法或代码块中
        • 匿名内部类访问外部成员:直接访问
        • 外部其他类不可以访问匿名内部类
        • 如果外部类和匿名内部类的成员重名时,匿名内部类的访问遵循就近原则,如果想访问外部类的成员,使用 外部类名.this.成员 去访问
      • 最佳实践
        • 把匿名内部类当做实参直接传递,简洁高效

    • 3️⃣成员内部类

      • 说明:定义在外部类的成员位置,并且没有static修饰
      • 可以访问外部类的所有成员,包括私有的
      • 可以添加任意访问修饰符,因为它本质就是一个成员
      • 语法
      • 作用域和外部类的其他成员一样,为整个类体
      • 成员内部类访问外部类:直接访问
      • 外部类访问成员内部类:创建对象再访问
      • 外部其他类访问成员内部类有两种方式:
        • 把内部类当做外部类的一个成员
        • 在外部内在写一个方法,返回内部类的对象
      • 外部类和成员内部类的成员重名时,内部类的访问,遵循就近原则,如果想访问外部类的成员,则可以使用 外部类名.this.成员 去访问
    • 4️⃣静态内部类

      • 说明:定义在外部类的成员位置,并且有static修饰
      • 可以直接访问外部类的所有静态成员,包括私有的,但是不能直接访问非静态成员
      • 可以添加任意的访问修饰符,因为它的地位就是一个成员
      • 作用域和其他成员一样,为整个类体
      • 静态内部类访问外部类:直接访问
      • 外部类访问静态内部类:创建对象,再访问
      • 外部其它类访问静态内部类的两种方式
        • 通过类名直接访问
        • 在外部类中创建一个方法,返回类的实例
      • 如果外部类和静态内部类的成员重名时,静态内部类访问时,遵循就近原则,如果想访问外部类的成员,则可以使用 外部类名.成员名 去访问
  • 相关阅读:
    一致性检验-简单Kappa
    现代物流有哪些特点?
    【安全测试之XSS攻击】安全测试实战之XSS攻击如何应对(基于web)
    VE对环境和社会的贡献
    第14章 Centreon 典型故障处理
    Kafka的存储机制和可靠性
    汽车电子 TLV1702AQDGKRQ1 比较器 通用 开路集电极
    表格背单词的方法
    Mysql序列
    R语言使用lm函数拟合线性回归模型:使用predict函数和训练好的模型进行预测推理、使用plot函数可视化线图对比预测值和实际值曲线
  • 原文地址:https://blog.csdn.net/qq_39328436/article/details/128139716