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();成员内部类访问外部类成员的特点拓展成员内部类中可以直接访问外部类的静态成员也可以直接访问外部类的实例成员成员内部类的实例方法中可以直接拿到当前寄生的外部类对象外部类名.thisclass 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);//1003.静态内部类有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(){ } };特点匿名内部类本质是一个子类并会立即创建出一个子类对象作用用于更方便的创建一个子类对象注匿名内部类实际上是有名字的吗外部类名$编号.class2匿名内部类的常见使用形式通常作为一个对象参数传输给方法需求学生老师要参加游泳比赛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 1Java中的函数Lambda表达式x-2x 12.解决什么问题使用Lambda函数代替某些匿名内部类对象从而让程序代码更简洁可读性更好3.Lambda1认识LambdaJDK 8 开始新增的一种语法形式它表示函数可以用于替代某些匿名内部类对象从而让程序更简洁可读性更好被重写方法的形参列表-{ 被重写方法的方法体代码 }注意Lambda表达式只能替代函数式接口的匿名内部类什么是函数式接口有且仅有一个抽象方法的接口//函数式接口只有一个抽象方法的接口 FunctionalInterface//声明函数式接口的注解该注解用于约束当前接口必须是函数式接口 interface Swim{ void swimming(); }2Lambda表达式的省略规则作用用于进一步简化Lambda表达式的写法具体规则参数类型全部可以省略不写如果只有一个参数参数类型省略的同时()也可以省略但多个参数不能省略()如果Lambda表达式只有一行代码大括号可以不写同时要省略分号“;” ,如果这行代码是return语句也必须去掉return4.方法引用1静态方法引用类名静态方法使用场景如果某个Lambda表达式里只是调用一个静态方法并且“-”前后参数的形式一致就可以使用静态方法引用。2实例方法引用对象名实例方法使用场景如果某个Lambda表达式里只是通过对象名称调用一个实例方法并且-前后参数的形式一致就可以使用实例方法引用。3特定类的方法引用特定类的名称方法使用场景如果某个Lambda表达式只是调用一个特定类型的实例方法并且前面参数列表中的第一个参数是作为方法的主调后面的所有参数都是作为该实例方法的入参的则此时既可以使用特定类型的方法引用。4构造器引用类名new使用场景如果某个Lambda表达式只是在创建对象并且-前后参数情况一致就可以使用构造器引用。注以上这些都是辅助我们在未来的时候能看懂别人写的代码很多时候不需要自己来写这些代码属于可遇不可求可以在后面的学习中慢慢掌握。四.常用API1.String1含义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.ArrayList1含义集合是一种容器用来装数据类似于数组2数组和集合的区别数组定义完成并启动后长度就固定了集合大小可变功能丰富开发中用的更多3关键做法创建ArrarList对象代表一个集合容器调用ArrarList提供的方法对容器中的数据进行增删改查操作ArrayListString list new ArrayList();//泛型定义集合 //由于Java是强类型语言所以需要用范式来定义数据类型