type
status
date
slug
summary
tags
category
icon
password
内部类
内部类就是在一个类A里又定义了一个类B, B类就是A类里的内部类
1. 成员内部类: 定义在类里,方法外的类,称之为成员内部类
2. 静态内部类: 在成员内部类前面添加 static修饰符,这种内部类称为静态内部类
3. 局部内部类: 定义在方法里的内部类,称为局部内部类
4. 匿名内部类: 使用最多的内部类形式
成员内部类
- 定义在类里方法外,和成员变量定义的位置一样。
- 成员内部类可以使用全部四种权限修饰符;普通类只能使用public和缺省的权限修饰符
- 成员内部类也会编译出一个.class文件,文件名是外部类名$内部类名.class
- 内部类可以访问外部类的所有成员,包括私有和静态的
- 内部类的成员变量如果和外部类的成员变量同名,可以使用 外部类名.this.成员变量 访问外部类里的属性
- 内部类里不能使用static定义静态变量,但是可以使用 final static 定义静态常量!
- 如果要创建一个内部类对象,必须要先创建外部类对象!
- 其他类是否能够访问到成员内部类,和成员内部类的权限修饰符有关!
包含成员内部类的变量访问问题
静态内部类
- 定义的位置和成员内部类的位置一样,只不过在前面加了static修饰符
- 静态内部类只能访问外部类的静态属性,不能访问非静态属性!
- 静态内部类还可以定义静态成员变量。
- 如果静态内部类里的静态成员变量和外部类的成员变量同名,可以通过类名.静态成员变量名访问
- 创建静态内部类时,可以不创建外部类对象!
局部内部类
1. 定义在方法里的内部类
2. 和局部变量一样,不能使用任何的权限修饰符,只能使用默认的权限修饰符
3. 局部内部类只能在声明它的那个方法里调用
4. 局部内部类出现以后,会有四个作用域,如果在四个作用域里都定义了同名的变量x
a. 外部类里的成员变量 LocalOuter.this.x
b. 外部类方法里的局部变量 无法访问
c. 局部内部类里的成员变量 this.x
d. 局部内部类里方法里的局部变量 x
5. 如果局部内部类里 没有和外部类方法里的局部变量 同名的变量,内部类里可以访问到外部类方法里的局部变量。
局部内部类如果访问外部类里局部变量,被访问的局部变量,不能被修改!
匿名内部类
抽象类和接口不能直接创建实例对象,必须要创建一个子类才能创建对象
代码块
用大括号包起来的代码就是代码块
方法代码块 / 语句代码块(if/while/for/synchronized/try...catch)
方法里出现的代码块 / 构造代码块 / 静态代码块
静态代码块只在加载类的时候加载一次,构造代码块每new一次,创建一个对象,执行一次构造代码块
静态代码块
- 当类被加载到内存时,会先执行静态代码块里的内容
- 可以对类进行初始化!
类加载进内存的时间
- 使用类创建对象时,类会被加载。
- 访问类里的静态变量或者调用静态方法时,类也会被加载。 注意:如果访问的是静态成员常量,类不会被加载!
- 子类加载时,会先加载父类
- 运行 main方法所在的类,也会加载这个类。
构造代码块
- 定义在类里方法外
- 无论调用哪个构造方法创建实例对象,都会先执行一次构造代码块里内容
- 构造代码块可以用来对 所有的实例对象进行统一的初始化
对象的初始化过程习题1
子类在创建实例对象之前,会先调用父类的构造方法和构造代码块,初始化父类空间
对象的初始化过程:
- 给HelloB类里成员变量设置默认值
- 调用构造方法里的super()初始化父类空间
- 给父类空间里成员变量设置默认值
- 调用父类构造方法里的super()初始化父类的父类
- 执行父类的构造代码块以及给父类的成员变量赋值,按照代码的书写顺序执行 I'm A Class"
- 执行父类构造方法里的其他代码。 HelloA
- 执行构造代码以及给成员变量赋值,按照代码的书写顺序执行 I'm B Class
- 执行构造方法里的其他代码。 HelloB
对象的初始化过程习题2
对象的初始化过程:
- 给Child里的成员变量设置默认值
- 调用构造方法里的super初始化父类People空间
- 给People里的成员变量设置默认值
- 调用People构造方法里的super初始化People的父类(省略)
- 调用People里构造代码块以及给成员变量赋值。(省略)
- 执行People构造方法里的其他代码
- 给Child成员变量赋值以及执行构造代码块,按照代码书写顺序执行(省略)
- 执行构造方法里的其他代码。
对象的初始化过程习题3
对象的初始化过程习题4
对象的初始化过程习题5
对象的初始化过程习题6
- 给Sub里的成员变量设置默认值
- 调用构造方法里的super()初始化父类空间
- Base里的成员变量设置默认值
- 调用 Base里的super()初始化父类空间
- 给Base里的成员变量赋值以及执行构造代码块
- 执行构造方法里的其他代码
- 给成员变量赋值以及执行构造代码块 x = "sub"
- 执行构造方法里的其他代码
对象的初始化过程习题6
- 给Sub里的成员变量设置默认值
- 调用构造方法里的super()初始化父类空间
- Base里的成员变量设置默认值
- 调用 Base里的super()初始化父类空间
- 给Base里的成员变量赋值以及执行构造代码块
- 执行构造方法里的其他代码
- 给成员变量赋值以及执行构造代码块
- 执行构造方法里的其他代码
类加载到对象的初始化过程习题1
- 加载类:
- Son类静态成员变量设置默认值(省略)
- 初始化父类Father
- Father里的静态成员变量设置默认值(省略)
- 初始化Father类的父类(省略)
- 给Father类里静态成员变量赋值以及执行静态代码块
- 执行Son类静态代码块以及给Son类静态成员变量赋值
- 实例化对象
- 给Son对象里的成员变量设置默认值(省略)
- 调用Son构造方法里的super()初始化父类Father类空间
- 给Father空间里的成员变量设置默认值(省略)
- 调用Father构造方法里的super()初始化Father类的父类空间(省略)
- 给Father成员变量赋值以及执行Father的构造代码块
- 执行Father构造方法里的其他代码
- 给Son对象的成员变量赋值以及执行构造代码块
- 执行Son构造方法里的其他代码
类加载到对象的初始化过程习题2
- 加载类:
- Zi类静态成员变量设置默认值
- 初始化父类Fu
- Fu里的静态成员变量设置默认值
- 初始化Fu类的父类
- 给Fu类里静态成员变量赋值以及执行静态代码块
- 执行Zi类静态代码块以及给Zi类静态成员变量赋值
- 实例化对象
- 给Zi对象里的成员变量设置默认值
- 调用Zi构造方法里的super()初始化父类Fu类空间
- 给Fu空间里的成员变量设置默认值
- 调用Fu构造方法里的super()初始化Fu类的父类空间
- 给Fu成员变量赋值以及执行Fu的构造代码块
- 执行Fu构造方法里的其他代码
- 给Zi对象的成员变量赋值以及执行构造代码块
- 执行Zi构造方法里的其他代码
类加载到对象的初始化过程习题3

类加载到对象的初始化过程习题4
- 作者:tacjin
- 链接:http://jin.wiki/article/31ffccd9-1b69-4d8f-a645-21ca81329c80
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。