一.内部类
如果一个类定义在另一个类的内部,这个类就是内部类。
内部类分为四种:成员内部类、静态内部类、局部内部类和匿名内部类。
1.成员内部类
成员内部内创建对象的格式:外部类名.内部类名 对象名=new 外部类名.new 外部类名();
成员内部类的特点:
1)成员内部类中可以定义实例成员,静态成员 (注意: 静态成员从JDK16开始支持)
2)成员内部类中的实例方法中,可以直接访问外部类的实例成员,静态成员,而外部类需要创建内部类的对象才能访问内部类中的非静态成员。
3)如果内部类和外部类出现了重名的成员,可以通过(外部类名.this.xxx) 强行访问外部类的成员
2.静态内部类
静态内部类创建对象的格式:外部类名.内部类名 对象名=new 外部类名.内部类名();
静态内部类的特点:
1)静态内部类中可以直接访问外部类的静态成员,不可以直接访问外部类的实例成员。
2)外部类中可通过创建静态内部类的对象来访问静态内部类中的非静态成员,
3.局部内部类
定义在方法中的内称为局部内部类。
4.匿名内部类
匿名内部类就是基于一个类或接口创建出的子类对象。
匿名内部类可以更方便的创建出一个子类对象,通常作为一个参数传输给方法。
二.泛型
用于避免强制类型转换,把具体的数据类型作为参数传给类型变量。
泛型分为三种:泛型类、泛型接口和泛型方法。
1.泛型类
定义泛型类的格式:
修饰符 class 类名<类型变量,...>{ //类型变量通常用字母E、T、K、V表示
}
创建泛型类对象的格式:
泛型类类名<引用型数据类型> 对象名=new 泛型类类名<>();
2.泛型接口
定义泛型接口的格式:
修饰符 interface 接口名<类型变量,...>{
}
创建泛型接口实现类的格式:
修饰符 class 类名 implements 泛型接口名<引用数据类型>{
}
3.泛型方法
定义泛型方法的格式:
public static <类型变量,...> 返回类型 方法名(){
}
泛型方法根据你调用时传过去的变量值来判断并替换类型变量,来达到泛型方法的目的。
4.通配符及泛型的上下限
通配符用于对传来的类型进行限制。只在创建各种泛型时使用。
在创建泛型类的对象时或创建泛型接口的实现类时可以用"?"表示一切类型。
泛型的上限:E extends 上限
泛型的下限:E super 下限
5.泛型擦除
泛型是工作在编译阶段的,一旦程序编译成class文件,class文件中就不存在泛型了,这就是泛型擦除。
泛型不支持基本数据类型,只能支持对象类型(引用数据类型)。
三.常量
使用了 static final 修饰的成员变量就被称为常量;
程序编译后,出现常量的地方全部会被替换成其记住的字面量,这样可以保证使用常量和直接用字面量的性能是一样的。
四.枚举
枚举是一种特殊类,常用于简洁的标识一些固定的值
1.枚举的定义格式
2.枚举类的特点
枚举类的第一行只能罗列一些名称,这些名称都是常量,并且每个常量记住的都是枚举类的一个对象。
枚举类的构造器都是私有的(写不写都只能是私有的),因此,枚举类对外不能创建对象。
枚举都是最终类,不可以被继承。
枚举类中,从第二行开始,可以定义类的其他各种成员。
五.Object类
toString存在的意义:toString()方法存在的意义就是为了被子类重写,以便返回对象具体的内容。
equals存在的意义:equals存在的意义就是为了被子类重写,以便子类自己来定制比较规则(比如比较对象内容)。
克隆分为浅克隆和深克隆。
1.浅克隆
作用:基于当前对象复制出一个一模一样的对象,其中的引用数据类型的变量指向同一块空间,也就是共享同一空间。
浅克隆前要做的准备:对应的类要实现Cloneable接口,此接口是个空接口,但必须实现,并且重写Object中的clone方法才能进行克隆。
浅克隆的方法:在类中重写方法。
浅克隆的使用:Object 对象名=对象名.clone(); 默认返回Object类型数据,可通过强转得到自己想要的数据。
2.深克隆
作用:基于当前对象复制出一个一模一样的对象,其中的引用数据类型不同于浅克隆,而是开辟出一个新的空间来存放复制过来的内容。
深克隆的方法:在浅克隆的基础上对clone进行如下操作。也就是在得到浅克隆的对象后再对其中的引用数据类型进行一次克隆。
六.Objects类
七.包装类
1.创建Integer对象的方法
其中valueOf是静态方法,可通过Integer.valueOf来调用
拓展:两个Integer类型的数据相加得到的是int类型。