Lazy loaded image
编程
📕Day11-面向对象5(内部类、代码块、类和对象的初始化)
字数 5493阅读时长 14 分钟
2019-1-23
2025-8-13
type
status
date
slug
summary
tags
category
icon
password

内部类

内部类就是在一个类A里又定义了一个类B, B类就是A类里的内部类 1. 成员内部类: 定义在类里,方法外的类,称之为成员内部类 2. 静态内部类: 在成员内部类前面添加 static修饰符,这种内部类称为静态内部类 3. 局部内部类: 定义在方法里的内部类,称为局部内部类 4. 匿名内部类: 使用最多的内部类形式

成员内部类

  1. 定义在类里方法外,和成员变量定义的位置一样。
  1. 成员内部类可以使用全部四种权限修饰符;普通类只能使用public和缺省的权限修饰符
  1. 成员内部类也会编译出一个.class文件,文件名是外部类名$内部类名.class
  1. 内部类可以访问外部类的所有成员,包括私有和静态的
  1. 内部类的成员变量如果和外部类的成员变量同名,可以使用 外部类名.this.成员变量 访问外部类里的属性
  1. 内部类里不能使用static定义静态变量,但是可以使用 final static 定义静态常量!
  1. 如果要创建一个内部类对象,必须要先创建外部类对象!
  1. 其他类是否能够访问到成员内部类,和成员内部类的权限修饰符有关!

包含成员内部类的变量访问问题

静态内部类

  1. 定义的位置和成员内部类的位置一样,只不过在前面加了static修饰符
  1. 静态内部类只能访问外部类的静态属性,不能访问非静态属性!
  1. 静态内部类还可以定义静态成员变量。
  1. 如果静态内部类里的静态成员变量和外部类的成员变量同名,可以通过类名.静态成员变量名访问
  1. 创建静态内部类时,可以不创建外部类对象!

局部内部类

1. 定义在方法里的内部类
2. 和局部变量一样,不能使用任何的权限修饰符,只能使用默认的权限修饰符
3. 局部内部类只能在声明它的那个方法里调用
4. 局部内部类出现以后,会有四个作用域,如果在四个作用域里都定义了同名的变量x a. 外部类里的成员变量 LocalOuter.this.x b. 外部类方法里的局部变量 无法访问 c. 局部内部类里的成员变量 this.x d. 局部内部类里方法里的局部变量 x
5. 如果局部内部类里 没有和外部类方法里的局部变量 同名的变量,内部类里可以访问到外部类方法里的局部变量。 局部内部类如果访问外部类里局部变量,被访问的局部变量,不能被修改!

匿名内部类

抽象类和接口不能直接创建实例对象,必须要创建一个子类才能创建对象

代码块

用大括号包起来的代码就是代码块
方法代码块 / 语句代码块(if/while/for/synchronized/try...catch) 方法里出现的代码块 / 构造代码块 / 静态代码块
静态代码块只在加载类的时候加载一次,构造代码块每new一次,创建一个对象,执行一次构造代码块

静态代码块

  1. 当类被加载到内存时,会先执行静态代码块里的内容
  1. 可以对类进行初始化!

类加载进内存的时间

  1. 使用类创建对象时,类会被加载。
  1. 访问类里的静态变量或者调用静态方法时,类也会被加载。 注意:如果访问的是静态成员常量,类不会被加载!
  1. 子类加载时,会先加载父类
  1. 运行 main方法所在的类,也会加载这个类。

构造代码块

  1. 定义在类里方法外
  1. 无论调用哪个构造方法创建实例对象,都会先执行一次构造代码块里内容
  1. 构造代码块可以用来对 所有的实例对象进行统一的初始化

对象的初始化过程习题1

子类在创建实例对象之前,会先调用父类的构造方法和构造代码块,初始化父类空间 对象的初始化过程:
  1. 给HelloB类里成员变量设置默认值
  1. 调用构造方法里的super()初始化父类空间
    1. 给父类空间里成员变量设置默认值
    2. 调用父类构造方法里的super()初始化父类的父类
    3. 执行父类的构造代码块以及给父类的成员变量赋值,按照代码的书写顺序执行 I'm A Class"
    4. 执行父类构造方法里的其他代码。 HelloA
  1. 执行构造代码以及给成员变量赋值,按照代码的书写顺序执行 I'm B Class
  1. 执行构造方法里的其他代码。 HelloB

对象的初始化过程习题2

对象的初始化过程:
  1. 给Child里的成员变量设置默认值
  1. 调用构造方法里的super初始化父类People空间
    1. 给People里的成员变量设置默认值
    2. 调用People构造方法里的super初始化People的父类(省略)
    3. 调用People里构造代码块以及给成员变量赋值。(省略)
    4. 执行People构造方法里的其他代码
  1. 给Child成员变量赋值以及执行构造代码块,按照代码书写顺序执行(省略)
  1. 执行构造方法里的其他代码。

对象的初始化过程习题3

对象的初始化过程习题4

对象的初始化过程习题5

对象的初始化过程习题6

  1. 给Sub里的成员变量设置默认值
  1. 调用构造方法里的super()初始化父类空间
    1. Base里的成员变量设置默认值
    2. 调用 Base里的super()初始化父类空间
    3. 给Base里的成员变量赋值以及执行构造代码块
    4. 执行构造方法里的其他代码
  1. 给成员变量赋值以及执行构造代码块 x = "sub"
  1. 执行构造方法里的其他代码

对象的初始化过程习题6

  1. 给Sub里的成员变量设置默认值
  1. 调用构造方法里的super()初始化父类空间
    1. Base里的成员变量设置默认值
    2. 调用 Base里的super()初始化父类空间
    3. 给Base里的成员变量赋值以及执行构造代码块
    4. 执行构造方法里的其他代码
  1. 给成员变量赋值以及执行构造代码块
  1. 执行构造方法里的其他代码

类加载到对象的初始化过程习题1

  1. 加载类:
    1. Son类静态成员变量设置默认值(省略)
    2. 初始化父类Father
      1. Father里的静态成员变量设置默认值(省略)
      2. 初始化Father类的父类(省略)
      3. 给Father类里静态成员变量赋值以及执行静态代码块
    3. 执行Son类静态代码块以及给Son类静态成员变量赋值
  1. 实例化对象
    1. 给Son对象里的成员变量设置默认值(省略)
    2. 调用Son构造方法里的super()初始化父类Father类空间
      1. 给Father空间里的成员变量设置默认值(省略)
      2. 调用Father构造方法里的super()初始化Father类的父类空间(省略)
      3. 给Father成员变量赋值以及执行Father的构造代码块
      4. 执行Father构造方法里的其他代码
    3. 给Son对象的成员变量赋值以及执行构造代码块
    4. 执行Son构造方法里的其他代码

类加载到对象的初始化过程习题2

  1. 加载类:
    1. Zi类静态成员变量设置默认值
    2. 初始化父类Fu
      1. Fu里的静态成员变量设置默认值
      2. 初始化Fu类的父类
      3. 给Fu类里静态成员变量赋值以及执行静态代码块
    3. 执行Zi类静态代码块以及给Zi类静态成员变量赋值
  1. 实例化对象
    1. 给Zi对象里的成员变量设置默认值
    2. 调用Zi构造方法里的super()初始化父类Fu类空间
      1. 给Fu空间里的成员变量设置默认值
      2. 调用Fu构造方法里的super()初始化Fu类的父类空间
      3. 给Fu成员变量赋值以及执行Fu的构造代码块
      4. 执行Fu构造方法里的其他代码
    3. 给Zi对象的成员变量赋值以及执行构造代码块
    4. 执行Zi构造方法里的其他代码

类加载到对象的初始化过程习题3

notion image

类加载到对象的初始化过程习题4

 
 
上一篇
Day10-面向对象4(接口、抽象类、多态)
下一篇
Day12-面向对象6(枚举、包装类)