一、内部类
1. 什么是内部类
在类的内部定义一个类,专门服务于外部类,便于访问外部类的属性和方法。
2. 内部类的分类
- 成员内部类:定义在类的成员变量的位置
- 静态内部类:使用起来跟普通的外部类基本一致;
- 非静态内部类:JDK17开始可以声明静态成员了;
- 局部内部类:定义在类的方法中
- 普通局部内部类:局部内部类访问方法中的局部变量时,该局部变量必须是final的。(注)
- 匿名内部类:没有名字。当一个类只使用一次,下次不需要使用名字调用。
注:为何必须是final,是由于局部变量是放在栈中,方法结束时立刻回收。而内部类是由垃圾回收机制回收的,不会立刻销毁。故局部变量必须加final修饰,将变量放到方法区中。
内部类的class文件:文件名 = 外部类名$内部类名.class
3. 语法格式
匿名内部类:
new 类名(){ public void dance(){System.out.println("跳舞");}
}
二、代码块
1. 什么是代码块
程序中使用{}包围的代码
2. 代码块的分类
静态代码块
格式:static{}包围的代码块
静态代码块随着类的加载而加载,只会执行一次。通常执行一些类加载时要完成的工作。先于非静态代码块和构造器执行。
非静态代码块
格式:{}包围的代码块
也称为实例代码块,构造代码块,先于构造器执行。通常把所有构造器都会执行的共同代码写在实例代码块中。每次创建对象时都会执行该段代码。
三、类的初始化和实例化
1. 初始化
静态变量的赋值过程
类初始化时,底层会执行一个初始化方法clinit方法。类的初始化在类加载过程中只执行一次,一个类初始化前必须先初始化其父类。
- ①默认值
- ②直接赋值:这两种赋值方式的先后跟位置有关
- 直接显式赋值
- 静态代码块赋值
2. 实例化
实例变量的赋值过程
构造器创建对象时,底层会执行init方法。其中会执行下面这几个赋值步骤。
- ①默认值
- ②this() 或super()
- ③直接赋值:这两种赋值方式的先后跟位置有关
- 直接显式赋值
- 实例代码块赋值
- ④构造器赋值
四、Junit单元测试框架
用来单元测试的框架,使用前需要先导入jar包。主要功能是单元模块测试和Before和After功能。
1. 使用方法
- 导入jar包,add as library
- 在模块管理界面加入该jar包,改为compile模式
- 编写测试方法,在测试方法上面那行添加@Test
2. 注意事项
- 测试方法不要命名为Test,会和@Test名字冲突
- 测试方法不能带参数
- 测试方法不能测试Scanner和多线程
五、单例设计模式
设计模式是程序员长期工作过程中总结出来的经验套路。下面就是单例设计模式的代码, 这个是饿汉式的实现。饿汉式的含义是指先创建一个类的对象实例,不管是否有调用getInstance方法。
public class Student{//饿汉式//静态常量:在类加载过程中值进行初始化,只有一份private static final Student instance = new Student();//构造器私有化,无法通过构造器创建多个对象private Student(){System.out.println("空参构造器");}public static Student getInstance(){return instance;}
}
还有一种实现方法,懒汉式,当外部代码调用getInstance方法时才会创建对象实例。并且该方法有线程安全问题。
public class Singleton{//静态变量private static Singleton instance = null;//构造器私有化private Singleton(){}//公共的静态方法,返回一个当前类的实例public static Singleton getInstance(){//延时加载if(instance == null){instance = new Singleton();//临时创建会花费时间}return instance;}
}