Java进阶必会:代码块、四种内部类、Lambda表达式与常用API(String+ArrayList)全梳理

📅 2026/7/13 21:47:32 👁️ 阅读次数 📝 编程学习
Java进阶必会:代码块、四种内部类、Lambda表达式与常用API(String+ArrayList)全梳理

一.代码块

1.含义

代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类)

2.代码块分类

静态代码块:

  • 格式:static{ }
  • 特点:类加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次
  • 作用:完成类的初始化,例如:对静态变量的初始化赋值
package com.itheima.code; //引用Arrays类后续代码就能使用 Arrays 类所提供的各种操作数组的实用方法了。 import java.util.Arrays; public class CodeDemo1 { public static String name ;//静态变量就属于静态资源 public static String[] cards = new String[54]; //静态代码块:有static修饰,属于类,与类一起优先加载,自动执行一次 //基本作用:可以完成对类的静态资源的初始化 static { //优先加载 System.out.println("静态代码块执行了"); name = "张三"; cards[0] = "大王"; cards[1] = "小王"; } public static void main(String[] args) { System.out.println("main方法执行了"); System.out.println(name); System.out.println(Arrays.toString(cards));//这里提供了一个数组工具Arrays类,toString()方法,可以将数组转换成字符串 //不然直接输出数组,会打印其所在地址,不能出现想要的内容 } }

实例代码块

  • 格式:{ }
  • 特点:每次创建对象时,执行实例代码块,并在构造器前执行
  • 作用:和构造器一样,都是用来完成对象的初始化的,例如:对实例对象进行初始化赋值
package com.itheima.code; public class CodeDemo2 { private String name;//属于对象的实例资源 private String[] directions = new String[4];//实例变量 //实例代码块:无static修饰,属于对象,每次创建对象时,都会优先执行一次 //基本作用:初始化对象的实例资源 { System.out.println("实例代码块执行了"); name = "张三";//所有对象的名字都被初始化成张三 directions[0] = "North"; directions[1] = "South"; directions[2] = "East"; directions[3] = "West"; } public static void main(String[] args) { //目标:实例代码块 System.out.println("main方法执行了"); new CodeDemo2(); new CodeDemo2(); new CodeDemo2(); new CodeDemo2(); } }

二.内部类

1.含义

如果一个类定义在另一个类的内部,这个类就是内部类。

场景:当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个设计成内部类。

public class Car{ //内部类 public class Engine{ } }

2.成员内部类

就是类中的一个普通成员,类似前面学过的普通的成员变量、成员方法

public class Outer{ //成员内部类 public class Inner{ } }
创建对象的格式: 外部类名.内部类名 对象名 = new 外部类(...).new 内部类(...); Outer.Inner in = new Outer().new Inner();

成员内部类访问外部类成员的特点(拓展):

  • 成员内部类中可以直接访问外部类的静态成员,也可以直接访问外部类的实例成员
  • 成员内部类的实例方法中,可以直接拿到当前寄生的外部类对象:外部类名.this
class People{ private int hearBeat = 100; public class Heart { private int hearBeat = 80; public void show(){ int hearBeat = 200; System.out.println(heartBeat);//200 System.out.println(this.heartBeat);//80 System.out.println(People.this.heartBeat);//100

3.静态内部类

static修饰的内部类,属于外部类自己持有

public class Outer{ //静态内部类 public static class Inner{ } }
外部类名.内部类名 对象名 = new 外部类.内部类(...); Outer.Inner in = new Outer.Inner();

注:外部类的实例成员属于外部类的对象

成员内部类访问外部类成员的特点(拓展):

  • 静态内部中可以直接访问外部类的静态成员
  • 静态内部类不可以直接访问外部类的实例成员

4.局部内部类(了解就行,鸡肋语法)

局部内部类是定义在方法中、代码块中、构造器等执行体中。

5.匿名内部类(重点)

1)含义

是一种特殊的内部类

所谓匿名:指的是程序员不需要为这个类声明名字默认有个隐藏的名字

new 类或接口(参数值...){ //参数值一般不写 类体(一般是方法重写); };
new Animal(){ @Override public void cry(){ } };

特点:匿名内部类本质是一个子类,并会立即创建出一个子类对象

作用:用于更方便的创建一个子类对象

注:匿名内部类实际上是有名字的吗,外部类名$编号.class

2)匿名内部类的常见使用形式

通常作为一个对象参数传输给方法

需求:学生,老师要参加游泳比赛

public class Teat2{ public static void main(String[] args){ //目标:搞清楚匿名内部类的使用形式(语法),通常可以作为一个对象参数传输给方法使用 //需求:老师,学生参加游泳比赛 Swim s1 = new Swim(){ @Override public void swimming(){ System.out.println("学生游得快"); } } start(s1); } //设计一个方法,可以接受老师,学生开始比赛 public static void start(Swim s){//上面的匿名内部类作为对象参数传递给下面 System.out.println("开始...."); s.swimming(); System.out.println("结果..."); } } interface Swim{ void swimming();//游泳方法 }

3)匿名内部类的应用场景

  • 调用别人提供的方法实现需求时,这个方法正好可以让我们传输一个匿名内部类对象给其使用
  • 使用comparator接口的匿名内部类实现对数组进行排序

三.函数式编程

1.含义

此”函数“类似于数学中的函数(强调做什么),只要输入的数据一致返回的结果也是一致的

eg:

数学中的函数示例:2x + 1

Java中的函数(Lambda表达式):(x)->2x + 1

2.解决什么问题

使用Lambda函数代替某些匿名内部类对象,从而让程序代码更简洁,可读性更好

3.Lambda

1)认识Lambda

JDK 8 开始新增的一种语法形式,它表示函数

可以用于替代某些匿名内部类对象,从而让程序更简洁,可读性更好

(被重写方法的形参列表)->{ 被重写方法的方法体代码 }

注意:Lambda表达式只能替代函数式接口的匿名内部类!!!

什么是函数式接口:有且仅有一个抽象方法的接口

//函数式接口:只有一个抽象方法的接口 @FunctionalInterface//声明函数式接口的注解,该注解用于约束当前接口必须是函数式接口 interface Swim{ void swimming(); }

2)Lambda表达式的省略规则

作用:用于进一步简化Lambda表达式的写法

具体规则:

  • 参数类型全部可以省略不写
  • 如果只有一个参数,参数类型省略的同时"()"也可以省略,但多个参数不能省略"()"
  • 如果Lambda表达式只有一行代码,大括号可以不写,同时要省略分号“;” ,如果这行代码是return语句,也必须去掉return

4.方法引用

1)静态方法引用

类名::静态方法

使用场景:如果某个Lambda表达式里只是调用一个静态方法,并且“->”前后参数的形式一致,就可以使用静态方法引用。

2)实例方法引用

对象名::实例方法

使用场景:如果某个Lambda表达式里只是通过对象名称调用一个实例方法,并且"->"前后参数的形式一致,就可以使用实例方法引用。

3)特定类的方法引用

特定类的名称::方法

使用场景:如果某个Lambda表达式只是调用一个特定类型的实例方法,并且前面参数列表中的第一个参数是作为方法的主调,后面的所有参数都是作为该实例方法的入参的,则此时既可以使用特定类型的方法引用。

4)构造器引用

类名::new

使用场景:如果某个Lambda表达式只是在创建对象,并且"->"前后参数情况一致,就可以使用构造器引用。

注:以上这些都是辅助我们在未来的时候能看懂别人写的代码,很多时候不需要自己来写这些代码,属于可遇不可求,可以在后面的学习中慢慢掌握。

四.常用API

1.String

1)含义

String代表字符串,它的对象可以封装字符串数据,并提供很多方法完成对字符串的处理

2)关键做法

创建字符串对象,封装字符串数据

调用String提供的字符串数据的方法

3)方法

方法一:Java程序中的所有字符串文字(例如“abc”)都为此类的对象

String name = "xiaohei"; String school = "heimachengxuyuan"

方法二:调用String类的构造器初始化字符串对象

public String():创建一个空白字符串对象,不含有任何内容

public String(String original):根据传入的字符串内容,来创建字符串对象

public String(char[ ] chars):根据字符数组的内容,来创建字符串对象

public String(byte[ ] bytes):根据字节数组的内容,来创建字符串对象

注:只有“”给出的字符串对象放在字符串常量池,相同内容只放一个

注:字符串对象的内容比较,千万不要用“==”,因为“==”默认比较地址,字符串对象的内容一样时地址不一定一样。

2.ArrayList

1)含义

集合是一种容器,用来装数据,类似于数组

2)数组和集合的区别

数组定义完成并启动后,长度就固定了

集合大小可变,功能丰富,开发中用的更多

3)关键做法

创建ArrarList对象,代表一个集合容器

调用ArrarList提供的方法,对容器中的数据进行增删改查操作

ArrayList<String> list = new ArrayList<>();//泛型定义集合 //由于Java是强类型语言,所以需要用范式来定义数据类型