内部类和类的初始化实例化过程

一、内部类

1. 什么是内部类

在类的内部定义一个类,专门服务于外部类,便于访问外部类的属性和方法。

2. 内部类的分类

  • 成员内部类:定义在类的成员变量的位置
    • 静态内部类:使用起来跟普通的外部类基本一致;
    • 非静态内部类:JDK17开始可以声明静态成员了;
  • 局部内部类:定义在类的方法中
    • 普通局部内部类:局部内部类访问方法中的局部变量时,该局部变量必须是final的。(注)
    • 匿名内部类:没有名字。当一个类只使用一次,下次不需要使用名字调用。

:为何必须是final,是由于局部变量是放在栈中,方法结束时立刻回收。而内部类是由垃圾回收机制回收的,不会立刻销毁。故局部变量必须加final修饰,将变量放到方法区中。

内部类的class文件:文件名 = 外部类名$内部类名.class

3. 语法格式

匿名内部类:

new 类名或接口名(){
	
	public void dance(){
		    System.out.println("跳舞");
	}
}

二、代码块

1. 什么是代码块

程序中使用{}包围的代码

2. 代码块的分类

public class MyClass{
	//静态代码块
	static{
		System.out.println("...");
	}
	
	//静态代码块
	{
		System.out.println("...");
	}
}

静态代码块

格式: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;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值