一、内部类
1.1成员内部类
概念:就是类中一个普通的成员,类似于普通成员变量、方法
使用:外部类.内部类 变量名 = new 外部类().new 内部类()
特点:可以访问外部类的实例成员、静态成员;拿到外部类的对象:外部类.this.对象名
Demo
1.2静态内部类
1.3局部内部类
1.4匿名内部类[重点]
格式:new 类或接口(参数值…) {
类体(一般是方法重写);
};
就是一种特殊的局部内部类;所谓匿名:指的是程序员不需要为这个类声明名字。
特点:匿名内部类的本质就是一个对象,并且会直接创建一个子类对象。
作用:更方便的创建一个对象。
使用场景:匿名内部类通常作为一个参数传输给方法。
Demo
二、枚举
概述:是一种特殊类
格式:修饰符 enum 枚举类名 {}
特点:{}里的第一行只能用来定义变量(其实就是常量),定义多少个就有多少个。构造器私有,不能对外创建对象;枚举是最终类,不能被继承
Demo
三、泛型
定义类、接口、方法时,同时声明了一个或者多个类型变量(如:<E>) ,称为泛型类、泛型接口,泛型方法、它们统称为泛型。
本质:把具体的数据类型作为参数传给类型变量
好处:多个类可以变成一个类,相当一个类去实现它类本身的功能,我们就要创建相应的类去实现,但是如果定义一个类,就可以根据传输<E>的类型进行操作,一个泛型类就可以处理多个类的功能
Demo
自定义泛型类
泛型接口
泛型方法
注意事项:
泛型是工作在编译阶段的,一旦程序编译成class文件,class文件中就不存在泛型了,这就是泛型擦除。
泛型不支持基本数据类型,只能支持对象类型(引用数据类型)。只能使用它们的包装类去定义
四、ava.lang 包下的常用API
API概述
API(Application Programming interface) :应用程序编程接口
就是Java帮我们已经写好一些程序,如:类、方法等,我们直接拿过来用就可以解决一些问题。
4.1 Object类
Object类是Java中所有类的祖宗类,因此,Java中所有类的对象都可以直接使用Object类中提供的一些方法。
1.Object中toString方法的作用是什么?存在的意义是什么?
基本作用:返回对象的字符串形式。
存在的意义:让子类重写,以便返回子类对象的内容。
Demo
Object中equals方法的作用是什么?存在的意义是什么?
基本作用:默认是比较两个对象的地址是否相等。
存在的意义:让子类重写,以便用于比较对象的内容是否相同。
Demo
4.2 Objects
Objects是一个工具类,提供了很多操作对象的静态方法给我们使用。
4.3包装类
包装类就是把基本类型的数据包装成对象。
为了万物皆对象,并且泛型和集合都不支持基本类型,支持包装类
8种,int -> Integer , char -> Character,其他的都是首字母大写
自动装箱:基本数据类型可以自动转换为包装类型。
自动拆箱:包装类型可以自动转换为基本数据类型。
Demo
作用:
把包装类数据类型转化为字符串类型:ToString()方法
可以把字符串类型的数值转换成真实的数据类型。public static int parseInt(String s)
4.4 StringBuilder、StringBuffer
对于字符串相关的操作,如频繁的拼接、修改等,建议用StringBuidler,效率更高!
注意:如果操作字符串较少,或者不需要操作,以及定义字符串变量,还是建议用String。
这里我们就比较三String、StringBuilder、StringBuffer 的拼接
但 StringBuilder是线程不安全的 StringBuffer是线程安全的
总结:
String 是不可变字符串、频繁操作字符串会产生很多无用对象,性能差。
StringBuilder:是内容可变的字符串、拼接字符串性能好、代码优雅。
注意:如果操作字符串较少,或者不需要操作,以及定义字符串时,则用String。
4.5 StringJoiner
相对于stringBuider的效率较低,在jdk8之后的StringJoiner不仅能提高字符串的操作效率,并且在有些场景下使用它操作字符串,代码会更简洁
Demo