一.通配符

通配符 ? 是在使用泛型类型时使用的,通常用于声明一个方法的参数、局部变量或字段的类型。它表示一种“未知的类型”。

1.使用

2.通配符上界

语法:

使用:

3.通配符上界

语法:

使用:

二 .String 类

在Java程序中,类似于:1, 2, 3,3.14,“hello”等字面类型的常量经常频繁使用,为了使程序的运行速度更快、 更节省内存,Java为8种基本数据类型和String类都提供了常量池。

为了节省存储空间以及程序的运行效率,Java中引入了:

1. Class文件常量池:每个.Java源文件编译后生成.Class文件中会保存当前类中的字面常量以及符号信息

2. 运行时常量池:在.Class文件被加载时,.Class文件中的常量池被加载到内存中称为运行时常量池,运行时常 量池每个类都有一份

3. 字符串常量池

字符串常量池

字符串常量池在不同jdk版本会储存到不同位置,这里主要介绍jdk7之后的版本

字符串常量池在JVM中是StringTable类,实际是一个固定大小的HashTable(哈希桶)

1.举例及其图像

2.intern方法

作用:把一个不在字符串常量池的String对象添加到字符串常量池中

三. 反射

1.定义

Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任 意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们就可以修改部分类型信息;这种动态获取信 息以及动态调用对象方法的功能称为java语言的反射(reflection)机制。

2.用途

1.在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统 应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法 

2.反射最重要的用途就是开发各种通用框架,比如在spring中,我们将所有的类Bean交给spring容器管理,无 论是XML配置Bean还是注解配置,当我们从容器中获取Bean来依赖注入时,容器会读取配置,而配置中给的 就是类的信息,spring根据这些信息,需要创建那些Bean,spring就动态的创建这些类。

3.放射相关的类

4.Class类(反射机制的起源 )

Java文件被编译后,生成了.class文件,JVM此时就要去解读.class文件 ,被编译后的Java文件.class也被JVM解析为 一个对象,这个对象就是java.lang.Class .这样当程序在运行时,每个java文件就最终变成了Class类对象的一个实 例。我们通过Java的反射机制应用到这个实例,就可以去获得甚至去添加改变这个类的属性和动作,使得这个类成 为一个动态的类 .

4.1 相关方法

常用获得类相关的方法:

常用获得类中属性相关的方法:

获得类中构造器相关的方法:

获得类中方法相关的方法:

获取Class对象的相关方法:

5.使用

// 方式一:用 new 和 .class(编译期确定)
public void processCar() {
    Car car = new Car();                    // 编译期确定
    Class<?> clazz = Car.class;              // 编译期确定
    // 只能处理 Car
}

public void processShip() {
    Ship ship = new Ship();                  // 编译期确定
    Class<?> clazz = Ship.class;              // 编译期确定
    // 只能处理 Ship
}
// 100 个类就得写 100 个方法...

// 方式二:用.forName()反射(运行期确定)
public void process(String className) throws Exception {
    Class<?> clazz = Class.forName(className);  // 运行到这才知道是谁
    Object obj = clazz.newInstance();           // 动态创建
    // 一个方法处理所有类!
}

// 调用时
process("Car");   // 处理 Car
process("Ship");  // 处理 Ship
// 配置文件里改个字符串,就能处理新类,代码不用改!

// 方式三:用.getClass()反射(运行期确定)
public void processObject(Object obj) {
    // 运行时才知道 obj 到底是 Car 还是 Ship 还是其他
    Class<?> clazz = obj.getClass();  // 通过实例拿到 Class 对象
    
    System.out.println("这个对象的类是:" + clazz.getName());
    // 可以继续反射操作...
}

6.总结

场景举例

假设有一个User类

public class User {
    private String name;
    public void sayHello() {}
}

1.编译阶段

一开始为User.java文件,进行编译后转化为.class(二进制文件)文件

2.加载阶段

JVM通过类加载器读取User.class文件,解析出类中的所有信息(类名是什么,有哪些成员变量或成员方法等),然后把这些信息加载到元数据区

3.创建镜像

JVM会在堆中创建一个java.lang.Class对象,每个类只有一个,该对象指向元数据区的类元数据

4.后续使用

当你new User()时,JVM会根据方法区的“模板”在堆中创建实例

当你使用User.class、user.getClass()、Class.forName()就会得到第3步得到的镜像(反射入口,通过),然后可以通过newInstance来创建实例

四.枚举

1.背景及其定义

枚举是在JDK1.5以后引入的。主要用途是:将一组常量组织起来,在这之前表示一组常量,通常使用定义常量的方式,如static final RED = 1, 但是常量举例有不好的地方,例如:可能碰巧有个数字1,但是他有可能误会为是RED,现在我们可以直接用枚举 来进行组织,这样一来,就拥有了类型,枚举类型。而不是普通的整形1。

本质:自己写的枚举类,是 java.lang.Enum 的子类就算没有显示的继承Enum,但是其默认继承了 这个类。

2.使用

2.1 switch使用

2.2 方法使用

2.3 带参数的构造方法

枚举的构造器必须私有,根本原因是枚举常量(如 OK)是 public static final 的类变量,其唯一实例必须在类加载时的静态初始化阶段由 JVM 创建。若构造器不是私有的,外部代码就能用 new 创建额外实例,破坏枚举的“单例性”和“类型安全”。
枚举实例的数量(有哪些常量)在编译期由编译器确定,而实例的实际创建动作发生在类加载(<clinit>时。
至于枚举内部定义的字段(如 code),它们属于实例对象,不是静态的,用 final 修饰仅代表该属性不可变,其赋值遵循普通 final 实例变量的规则——必须在构造方法内完成(或声明时赋值,只能被赋值一次,所以2选1)。

3.访问枚举类的私有方法及其失败原因

这个判断语句判断了是否为枚举,如果是枚举类就会抛出异常

五.lambda表达式

1.概念

Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达 式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体

语法:

1. paramaters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明 也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。

2. ->:可理解为“被用于”的意思

3. 方法体:可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不反 回,这里的代码块块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不反回。

2.使用

3. 函数式接口

要了解Lambda表达式,首先需要了解什么是函数式接口

定义:一个接口只有一个抽象方法

注意:如果我们在某个接口上声明了 @FunctionalInterface 注解,那么编译器就会按照函数式接口的定义来要求该接 口,这样如果有两个抽象方法,程序编译就会报错的。所以,从某种意义上来说,只要你保证你的接口中只 有一个抽象方法,你可以不加这个注解。加上就会自动进行检测的。

定义方式:

4.lambda表达式的使用

5.变量捕获

在匿名内部类或lambda表达式中,只要用到了重写方法外部的变量,该变量就会有和被 final 修饰的变量一样的性质,不能被修改

举例:

6.Lambda在集合当中的使用

为了能够让Lambda和Java的集合类集更好的一起使用,集合当中,也新增了部分接口,以便与Lambda表达式对 接。

6.1 Comparator接口

6.2  forEach方法

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐