初始化:
* 含义:
* 程序中内容加载到"堆内存"
* 分类:
* 实例初始化过程
* 类初始化过程
无继承关系的实例初始化过程
* 1.实例成员和构造器代码块,谁在前,优先加载谁
* 2.构造器中的显式代码
有继承关系的实例初始化过程
* 1.显式或隐式的super(实参),显式的this(实参)
* 2.实例成员和构造器代码块,谁在前,优先加载谁
* 3.构造器中除了super(实参)或this(实参)的显式代码
*
* 注意事项:
* 构造器中一旦含有this(实参),该构造器不会进行实例初始化过程
this关键字的第三种用法:
* 场景:
* 父类的实例方法中或父类的构造器中
* 格式:
* this.实例变量名;
* this.实例方法名(实参);
* 作用:
* 使用多态形式的对象调用实例变量或实例方法
* 含义:
* 哪个对象调用了this关键字所在的构造器或实例方法,this关键字就代表所在类型(this关键字所在的类名)的哪个多态形式对象
无继承关系的类初始化过程
* 静态成员和静态代码块谁在前优先加载谁
*
* 注意事项:
* 静态成员随着的类的加载而加载,而且只加载唯一的一次
内部类(嵌套类)
* 含义:
* 在类中声明另外的一个类
* 分类(根据类文件不同):
* 内部类
* 成员内部类
* 实例成员内部类(实例内部类)
* 静态成员内部类(静态内部类)
* 局部内部类
* 标准局部内部类(局部内部类)
* 匿名局部内部类(匿名内部类)
* 内部枚举类
* 内部接口
*
*
* 学习内部类的关注点:
* 学习目的
* 权限访问级别
* 格式
* 注意事项
成员内部类的学习目的
* 需求:某个类只想本类中进行访问或者本包内可以访问,不想被外界所访问,可以将这个类声明到某个类的成员中
实例成员内部类(实例内部类)
* 学习目的:
* 某个类只想本类中进行访问或者本包内可以访问,不想被外界所访问,且该类的所有成员都是非静态的,可以将这个类以实例成员内
* 部类的形式声明到某个类的成员中
* 权限访问级别
* 四种都可以,推荐private,缺省
* 格式
* public class 外部类类名 {
* 修饰符 class 内部类类名 {
*
* }
* }
* 注意事项
* 1.内部类对象创建的方式:
* 如果内部类的权限访问级别是"缺省",且在外部类之外进行对象创建:
* 后续需要使用外部类对象方式:
* 外部类类名 外部类对象名 = new 外部类类名();
* 外部类类名.内部类类名 内部类对象名 = 外部类对象名.new 内部类类名();
* 后续不用使用外部类对象方式:
* 外部类类名.内部类类名 内部类对象名 = new 外部类类名().new 内部类类名();
* 如果内部类的权限访问级别是"私有",且在外部类内部进行对象创建:
* 内部类类名 内部类对象名 = new 内部类类名(实参);
* 2.在实例成员内部类不能声明静态成员,如果含有静态成员,需要声明静态成员内部类
* 3.在外部类的实例成员中可以通过内部类对象访问内部类中的私有成员
* 4.如果在内部类中访问同名的外部类实例变量,需要使用外部类类名.this.实例变量名;
this关键字的第四种用法:
* 场景:
* 成员内部类的实例方法或成员内部类的构造器中
* 格式:
* 外部类类名.this.实例变量名;
* 外部类类名.this.实例方法名(实参);
* 作用:
* 用来区分外部类实例变量和内部类实例变量或局部变量同名的情况
* 用来区分外部类实例方法和内部类实例方法同名的情况
* 含义:
* 哪个对象调用了含有"外部类类名.this"的实例方法或构造器,"外部类类名.this"就代表哪个内部类对象的外部类对象
*
* super关键字的第四种用法:
* 场景:
* 成员内部类的实例方法或成员内部类的构造器中
* 格式:
* 外部类类名.super.实例变量名;
* 外部类类名.super.实例方法名(实参);
* 作用:
* 用来区分外部类父类实例变量和内部类实例变量或局部变量同名的情况
* 用来区分外部类父类实例方法和内部类实例方法同名的情况
* 含义:
* 哪个对象调用了含有"外部类类名.super"的实例方法或构造器,"外部类类名.super"就代表哪个内部类对象的外部类对象的父类引用
静态成员内部类(静态内部类)
* 学习目的
* 某个类只想本类中进行访问或者本包内可以访问,不想被外界所访问,且该类含有静态成员或想提高该类的加载时机,可以将这个类
* 以静态成员内部类的形式声明到某个类的成员中
* 权限访问级别
* 四种都可以,推荐private,缺省
* 格式
* public class 外部类类名 {
* 修饰符 static class 内部类类名 {}
* }
* 注意事项
* 1.如果想访问静态成员内部类中的静态成员
* 如果在该静态成员内部类的外部类的外界进行访问:
* 外部类类名.内部类类名.静态变量名;
* 外部类类名.内部类类名.静态变量方法(实参);
* 如果在该静态成员内部类的外部类的内部进行访问:
* 内部类类名.静态变量名;
* 内部类类名.静态变量方法(实参);
* 2.静态成员内部类中既可以有静态成员,也可以有实例成员,但是如果在外界访问内部类中的实例成员,还需要创建该内部类的对象
* 3.在外部类的成员中可以访问内部类的私有静态成员
标准局部内部类(局部内部类)
* 学习目的:
* 1.为"匿名内部类"进行铺垫
* 2.笔试题
* 权限访问级别:
* 只能缺省
* 格式:
* public class 外部类类名 {
* 修饰符 返回类型 方法名 () {
* 修饰符 class 内部类类名 {
*
* }
* }
* }
* 注意事项:
* 1.局部内部类不能被static关键字进行修饰
* 2.局部内部类在所属方法的外界不能被实例化,只能在所属方法中进行内部类对象的实例化操作
* 3.局部内部类对象的实例化操作必须在局部内部类声明的后面,否则编译报错
* 4.局部内部类所属方法的外部类局部变量和该局部内部类中的实例变量或局部变量发生同名的时候,在该局部内部类中无法进行访问
* 5.局部内部类所属方法的外部类局部变量如果进行重新赋值,则无法在该局部内部类中进行使用
* 6.局部内部类所属方法的外部类局部变量如果在局部内部类中进行使用,JVM的编译器会自动将其隐式修饰为final(常量)
* 原因:变量的赋值必须取决于该变量的数据类型
匿名局部内部类(匿名内部类)
* 学习目的:
* 1.简化接口的使用步骤
* 2.学习Lambda表达式的前提条件
* 权限访问级别
* 只能缺省
* 格式:
* 接口名 实现类对象名 = new 接口名() {
* 接口实现类的类体
* };
* 注意:
* 匿名内部类是接口实现类的匿名