本人的GitHub:戳我一下
一、静态代码块:
用static {}
包住的代码块叫做静态代码块。
特点:随着类的加载而执行,只执行一次
示例:
class StaticCode {
static {
System.out.println("a");
}
}
class StaticCodeDemo {
static {
System.out.println("b");
}
public static void main(String[] args) {
new StaticCode();
new StaticCode();
System.out.println("d");
}
static {
System.out.println("c");
}
}
这里注意其中“a”只打印了一次,“d”最后打印,由此可以看出静态代码块随着类的加载而执行,只执行一次
二、对象初始化时发生了什么
1、先找到相应的.class
文件加载到内存中
2、如果该类中有static
代码块,执行static
代码块
3、在堆内存中开辟空间,分配内存地址
4、在堆内存中建立对象的属性,并进行默认初始化
5、对属性进行显式初始化
6、对对象进行构造代码块的初始化
7、对对象进行构造函数的初始化
三、内部类
1、内部类的定义:可以直接在外部类中定义,也可以在外部类的成员函数中定义
class Outer {
private int x = 5;
class Inner {
public int y = 6;
}
}
class Outer {
void function() {
class Inner {
int num = 1;
}
}
}
2、内部类的访问规则:
- 内部类可以直接访问外部类的属性和方法,包括私有的属性和方法
- 外部类只能通过创建内部类对象的方式访问内部类的属性和方法,不能访问内部类的私有属性和方法
3、可以通过Outer.Inner = new Outer().new Inner()
的方法直接创建内部类(有该内部类的访问权限的前提下)
4、内部类可以用所有的权限修饰符修饰:private
public
default(默认)
protected
5、内部类可以被 static
修饰,同时就具有了static
的特性,只能访问外部类的静态属性和方法
6、内部类中还有一种匿名内部类,而想要定义一个匿名内部类,需要该匿名内部类继承一个抽象类或接口,其实,匿名内部类就是一个匿名内部子类,该子类实现继承与父类的抽象方法,示例:
abstract class AbsDemo {
abctract void t();
}
class Outer {
void function() {
new AbsDemo() {//匿名内部类
void t() {
System.out.println("Hello,world");
}
}.t();
}
}