NotionNext
NotionNext
编程爱好者
/互联网从业者
/知识分享博主
认知决定态度,态度决定选择,选择决定人生

Java面向对象之抽象

NotionNext - 2023-4-12 - Technical / Java / 后端
发布于:2023-4-12|最后更新: 2023-8-29|
type
status
date
slug
summary
tags
category
icon
password

什么是抽象(Abstraction)?

  • 抽象:从众多的事物中抽取共同的,本质性的特征,而舍弃其非本质的特征的过程
  • 面向对象编程中的抽象:只向用户展示对象的本质特征,隐藏内部细节以降低复杂性
  • 抽象举例:对不同平面图形求面积
  • 只需要知道“一个对象做什么?” 而不是 “它是怎么做到的?”
  • 如何实现抽象
    • 抽象方法/抽象类
    • 接口

抽象方法和抽象类

  • 抽象方法
    • abstract 修饰的方法
    • 没有方法体,只有方法签名
    • 抽象方法不能定义成private final static
  • 抽象方法定义语法
    • 修饰符 abstract 返回值 方法名(参数列表)
  • 抽象类
    • 用 abstract 修饰的类
    • 抽象类不能实例化,要用的话只能继承
    • 继承抽象类的子类必须实现父抽象类中的全部抽象方法
    • 非抽象方法可以在抽象类中实现
  • 抽象类定义语法
    • abstract class 类名 {}

接口 Interface

  • 接口是一组合约规范,可用于实现 100% 抽象,实现类必须遵守
  • 接口就像类一样,指定类必须实现的行为
  • 接口代表某种能力,而不是具体的实现
  • 两个关键字:interface / implements
  • 在 JDK 1.8之前接口中只有静态常量和抽象方法,Java8开始接口中可以有默认方法和静态方法
  • 接口中的字段只能说public static final接口中的方法为 public abstract
  • 一个类只能 extends 一个类,但可以 implements 多个接口

接口中的默认方法

如何解决接口默认方法冲突

  • 当实现接口遇到方法冲突的时候,需要去重写
  • InterfaceA.super.method();

接口中的静态方法

  • 在接口中的静态方法不能被 override
notion image

Java程序是如何编译运行的

  1. 编译
      • 写源代码 Main.java
      • 编译 通过javac Main.java —> Main.class 字节码文件 byteCode
  1. 运行
      • jvm java virtual machine
      • 类加载器 class loader 加载Main.class
      • 运行 java

变量的分类和作用域

  • 变量分类
    • Class Variables (Static Fields)类变量
    • Instance Variables (Non-Static Fields)实例变量
    • Local Varialbes 局部变量(局部变量仅对声明它们的方法可见)
    • Parameters 方法参数
  • 变量的作用域
    • 类变量:整个类到处都能用,只有一个,类加载的时候
    • 实例变量:类里面都能用(除static context 外),但是实例没有了就不行了
    • 局部变量:定义在某个方法、代码块中,且只在这个方法、代码块中有效的变量,
    • 就是花括号内有用
    • 方法参数

内部类

  • 目的:更加细粒度的封装
  • 非静态内部类可以使用外部类的成员方法/属性
  • 静态内部类无法直接使用外部类的方法/属性
  • 分类:非静态内部类/静态内部类/匿名内部类

从字节码角度分析内部类

  • 内部类是在另一个类中定义的类。当编译器编译包含内部类的Java程序时,将为每个内部类创建一个单独的.class文件。这个.class文件包含内部类的字节码。
  • 在内部类的字节码中,会包含对外部类的引用,这样内部类就可以访问外部类的成员和方法。这个引用被称为“外部类的引用”(Outer this)。
  • 另外,内部类还有一个特殊的标志 ACC_SYNTHETIC,这个标志在内部类和外部类的访问和调用之间起到了一个桥梁的作用。
  • 在使用内部类时,需要注意内部类的命名规则。内部类的名字格式为“外部类名$内部类名.class”,这表示这个类是外部类的一个成员。因为内部类的名字与外部类的名字不同,所以编译器可以在编译时将它们区分开来。
  • 总的来说,内部类在字节码层面实现了对外部类成员的访问和调用,而这个实现是在编译器层面进行的。

匿名内部类(Anonymous Class)

  • 没有名字的类,内部类的简化写法
  • 本质:继承该类或者实现接口的子类匿名对象
  • 用途:当某些方法用抽象类,或者接口作为参数,该方法仅调用一次,可以使用匿名内部类简化
 
 
Java集合一些重要的接口Java简单内存模型