1、内部类:概述、成员内部类
内部类:内部类是类中的一个成员,
创建方法:外部类.内部类 对象名= new 外部类(...).new 内部类(...);
成员内部类的实例方法的特点:可以直接访问外部类的所有成员;可以拿到当前外部类对象, 外部类.this
2、内部类:静态内部类[了解]
static 修饰的内部类:属于外部类自己特有
它的成员可以是静态的,它只能访问外部类中的静态成员。
3、内部类:匿名内部类[重点]
没有名字的类 :直接 new 出来的
new 类或接口(参数值...){ 类体(一般是方法重写);}
特点: 匿名内部类本质就是一个子类,并会立即创建出一个子类对象
作用:更方便的创建一个子类对象
用途:Thread 中直接 new 一个子线程并且重写方法
4、内部类:匿名内部类的使用场景
匿名内部类在开发中通常作为一个参数传输给方法
5、枚举:认识枚举
枚举类的第一行只能写一些名称,每个名称本质是常量,每个常量都会记住枚举类的一个对象
枚举类的构造器都是私有的,枚举类对外不能创建对象
枚举中,从第二行开始,可以定义类的其他成员
valueOf : 将字符串名称转换为枚举对象
主要用于在与web端交互中
枚举也可以创建单例对象 实现单例设计模式
6、枚举:枚举的作用
可以有效的控制传入数据的合法性,用switch分支类型判别如何返回相应的值
7、泛型:认识泛型
定义类,接口,方法时,同时声明一个或多个类型的变量
泛型的本质:把具体的数据类型作为参数传给具体的变量,
泛型本质上是一个类型变量,可以指定具体操作的数据类型。(基本数据 -> 包装类)
作用:泛型可以在编译阶段去检查数据的类型是否合法,可以避免不必要的类型强制转换及类型的强转异常。
8、泛型:泛型类
修饰方法:修饰符 class 类名<类型变量,类型变量,...> {}
类型变量:E,T,K,V
9、泛型:泛型接口
如何定义泛型接口 : interface 接口名<T>
10、泛型:泛型方法
如何定义泛型方法:修饰符 <T> 返回值 方法名(T t){}
注意 如果返回值类型是泛型 不是泛型方法
11、泛型:泛型的注意事项
泛型的擦除问题:泛型的工作在编译阶段的,在反射阶段有讲解一旦程序编译成class文件,class文件中就不存在泛型了,这就是泛型擦除。
泛型不支持基本数据类型,只能支持对象(应用数据类型)
12、API课程介绍
13、API:Object类的toString、equals方法
14、API-Object的克隆方法
继承cloneable需要一定重写clone()
默认clone是protected 的只能在本类和子类中使用,而且返回值类型是Object的需要强转
通过clone后可以将权限变成public 而且 可以返回当前类的类型,而不是Object类型,方便使用
深克隆
对象中的基本类型的数据直接拷贝
对象中的字符串数据拷贝的还是地址
对象中包含的其他对象,不会拷贝地址,会创建新对象
浅克隆
拷贝出的新对象,与原对象中的数据一摸一样(引用类型拷贝的只是地址)
如何克隆
类实现Cloneable接口,重写克隆方法
如果要深克隆,就需要将对象内部的引用类型数据再次克隆
对User对象中的非字符串,非基本类型数据再次做克隆
数组的clone()方法 是 浅克隆,是不能改变的
native :native标识的是调用java底层的方法栈的c或c++代码
对象的创建有3种 :new ; clone() ;反射
15、API-Objects类
工具类:
Objects.equals(a,b) :自动进行非空判断的对比
Objects.isNull() : 是否为空
Objects.nonNull(): 是否不为空
16、API-包装类
自动装箱和自动拆箱 (valueOf)
基本数据类型 -> 字符串类型
toString()
直接拼接一个空串 i + ""
字符串类型 -> 基本数据类型
valueOf / parseXxx(8种包装类型中 除了Character 类型)
泛型和通配符
E,T,K,V:主要用于第一种,声明泛型类或泛型方法,
无界通配符?:主要用于第二种,使用泛型类或者是泛型方法,