首页 > 编程语言 >JavaSE基础知识分享(十四)

JavaSE基础知识分享(十四)

时间:2024-08-23 19:15:32浏览次数:13  
标签:初始化 加载 接口 基础知识 获取 JavaSE 分享 表达式 Lambda

写在前面

今天继续讲Java中的类加载器和lambda表达式的知识!

类加载器和反射

类的加载

当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载、连接、初始化三步来实现对这个类进行初始化。

  1. 加载
    .class 文件读入内存,并为之创建一个 Class 对象。任何类被使用时系统都会建立一个 Class 对象。

  2. 连接

    • 验证:检查类的内部结构是否正确,并与其他类协调一致。
    • 准备:为类的静态成员分配内存,并设置默认初始化值。
    • 解析:将类的二进制数据中的符号引用替换为直接引用。
  3. 初始化
    执行类的静态初始化器和静态代码块。

一个类的初始化时机

  1. 创建类的实例。
  2. 访问类的静态变量,或者为静态变量赋值。
  3. 调用类的静态方法。
  4. 使用反射方式强制创建某个类或接口对应的 java.lang.Class 对象。
  5. 初始化某个类的子类。
  6. 直接使用 java.exe 命令运行某个主类。

类加载器

负责将 .class 文件加载到内存中,并为之生成对应的 Class 对象。了解类加载机制可以帮助更好地理解程序的运行。

类加载器的组成

  1. Bootstrap ClassLoader(根类加载器)
    负责加载 Java 核心类,如 SystemString 等。它在 JDK 的 JRE lib 目录下的 rt.jar 文件中。

  2. Extension ClassLoader(扩展类加载器)
    负责加载 JRE 扩展目录中的 JAR 包。在 JDK 的 JRE lib 目录下的 ext 目录中。

  3. System ClassLoader(系统类加载器)
    负责加载来自 java 命令的 .class 文件,以及 classpath 环境变量所指定的 JAR 包和类路径。

Java 反射机制

Java 反射机制允许在运行时动态获取类的信息以及调用对象的方法。

通过反射获取构造方法并使用

  • 获取构造方法

    • getConstructors()
    • getDeclaredConstructors()
  • 创建对象

    con.newInstance("zhangsan", 20);
    

通过反射获取成员变量并使用

  • 获取所有成员

    • getFields()
    • getDeclaredFields()
  • 获取单个成员

    • getField()
    • getDeclaredField()
  • 修改成员的值

    field.set(obj, value);
    

通过反射获取成员方法并使用

  • 获取所有方法

    • getMethods()
    • getDeclaredMethods()
  • 获取单个方法

    • getMethod()
    • getDeclaredMethod()
  • 暴力访问

    method.setAccessible(true);
    

Lambda 表达式

从 JDK 1.8 开始,Lambda 表达式简化了代码开发,支持函数式编程。

写 Lambda 表达式的场景

  1. 必须有相应的函数接口,函数接口是指内部有且仅有一个抽象方法的接口。
  2. 编译器通过类型推断机制可以推断出参数列表的类型。

Lambda 基本语法

Lambda 表达式由 -> 操作符分隔为两部分:

  • 左侧:指定 Lambda 表达式需要的所有参数(对应接口中的形参)。
  • 右侧:指定 Lambda 体,即要执行的功能(方法体)。

Lambda 表达式的分类

  1. 无参数,无返回值。
  2. 有一个参数,无返回值(若只有一个参数,小括号可以省略)。
  3. 有两个以上的参数,有返回值,并且 Lambda 体中有多条语句。
  4. 若 Lambda 体中只有一条语句,return 和大括号都可以省略。
  5. Lambda 表达式的参数列表的数据类型可以省略,JVM 编译器通过上下文推断出数据类型。

Java 内置函数式接口

  • Predicate<T>:断言型接口

    @FunctionalInterface
    public interface Predicate<T> {
        boolean test(T t);
    }
    
  • Function<T, R>:函数型接口

    @FunctionalInterface
    public interface Function<T, R> {
        R apply(T t);
    }
    
  • Supplier<T>:供给型接口

    @FunctionalInterface
    public interface Supplier<T> {
        T get();
    }
    
  • Consumer<T>:消费型接口

    @FunctionalInterface
    public interface Consumer<T> {
        void accept(T t);
    }
    

Lambda 用法再简洁之方法引用

  • 对象的方法引用

    对象引用::方法名
    
  • 静态方法引用

    类名::静态方法名
    
  • 构造方法引用

    类名::new
    
  • 数组创建引用

    元素类型[]::new
    

容易形成的误区

Lambda 表达式底层被封装成了主类的一个私有方法,并通过 invokedynamic 指令进行调用,简化了匿名内部类的写法。Lambda 表达式使代码更简洁,但也可能降低可读性。

优缺点

  • 优点

    • 减少代码书写,减少匿名内部类的创建,节省内存占用。
    • 使用时无需记忆接口和抽象函数。
  • 缺点

    • 易读性较差,需要熟悉 Lambda 表达式和抽象函数中参数的类型。
    • 不方便进行调试

标签:初始化,加载,接口,基础知识,获取,JavaSE,分享,表达式,Lambda
From: https://www.cnblogs.com/cjybigdatablog/p/18376884

相关文章

  • JavaSE基础(12)——文件、递归、IO流
    1、IO流Input:输入,写数据,数据从磁盘加载到内存(程序)中。Output:输出,读数据,数据从内存(程序)存储到磁盘中。流:不管是读还是写,都要对数据进行传输,传输的方式就是流2、File类数据的读写离不开文件,File类是可以对文件和目录(文件夹)级别,而不是内容本身进行增删改查的类。File类的API......
  • zblog免费插件分享前端代码支持一键复制
    zblog默认的代码文件在网页前端是不支持一键复制的,这会让访客复制长代码的时候不太方便,甚至有可能会出错,影响体验,下面分享一个非常简单的免费插件,安装之后,前端代码就能一键复制了。插件使用方法:1、点击最下方链接下载插件2、打开zblog后台,在插件管理里面上传刚下载的插件,安装......
  • 短剧系统搭建:从零搭建高效创意内容平台教程,源码分享+正版片源授权指南
     目录一、短剧系统是什么? 二、短剧系统怎么搭建技术选型 安全与性能优化测试与部署运营与维护三、部分代码展示 一、短剧系统是什么?短剧是一种采用单集时长15—30分钟的系列剧、集数在6集内的系列单元剧、20集内的连续剧、周播剧等多种形态的剧集。 短剧系统......
  • 金融基础知识-投资相关业务基本概念
    1.金融及金融机构金融〔Finance〕货币资金的融通。我们通常说的都是广义的金融,是指有关货币、信用的所有经济关系和交易行为的总称。金融机构〔FinancialInstitutes〕专门从事货币、信用活动的中介组织。目前,我国金融机构按其地位和功能可分为三大类:中央银行,金融监管......
  • 分享一个基于ChatGPT实现基于Convars布局思路的实现过程
    一、思路在AI的大背景,应用层算法已经不是问题,那么程序员的差距主要在认知思维模式和创新上面。目前AI的局限主要却决于沟通的效率,这是双方的问题,AI可能理解能力不足,或者提问者表达能力不足。这里我以PDFsharp实现Grid布局模式分享一下基于GPT实现的过程。因为PDFsharp只提供了XG......
  • C++入门基础知识29
    成长路上不孤单......
  • 拼图软件哪个好?5款实用工具让分享不再难
    巴黎不仅有精彩的奥运比赛,更有浪漫的文化和迷人的风景,不知你们是否打卡了呢?想必那些前去打卡游玩的朋友们,相机里一定装满了无数精彩的瞬间吧!但当你们想在朋友圈分享这些瞬间时,却可能会遇到一个尴尬的问题:只能发布9张照片。别急,今天就来告诉大家拼图软件有哪些,让你能够将所有......
  • 学习分享:如何学习 API 中的数据格式
    以下是学习API中数据格式的要点:一、了解常见数据格式JSON(JavaScriptObjectNotation):结构特点:它是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。JSON数据格式由键值对组成,类似于Python中的字典或者JavaScript中的对象。例如:{"name":"John",......
  • 05-04 Basics of Creating Persistent Objects for Existing Data Tables(为现有数据表
    BasicsofCreatingPersistentObjectsforExistingDataTables(为现有数据表创建持久对象的基础知识)ToaccessanexistingdatatableinadatabaseandworkwithitusingthefunctionalityprovidedbyeXpressPersistentObjects(XPO),youneedtocreateap......
  • 这年头,好好分享前端高质量文章也要被怼
    起因大家好,我是欧阳。熟悉的同学都知道欧阳的源码文章大都是4000字(除去代码)以上的高质量文章,基本没有水文。但就是这样欧阳昨天也被某2.6kstar的开源大佬给怼了,被怼了后欧阳有点不舒服,就把被怼的截图(未打码)发到了粉丝群和朋友圈。过了一会儿才发现欧阳不仅被怼了,还在粉丝群......