一、内部类
类的五大成分之一(成员变量、方法、构造器、内部类、代码块),如果一个类定义在另一个类的内部,这个类就是内部类。
场景:当一个类的内部,包含了一个完整事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。
public class Car{
//内部类
public class Engine{
}
}
1.成员内部类
就是类中的一个普通成员,类似于前面学到的普通成员变量、成员方法。
public class Outer{
//成员内部类
public class Inner{
}
}
成员内部类如何创建对象
Outer.Inner in = new Outer().new Inner();//先new外部类对象,再new内部类对象
in.test();
成员内部类中访问其他成员的特点
1.和前面学到的实例方法一样,成员内部类的实例方法中,同样可以直接访问外部类的实例成员、静态成员。
2.可以在成员内部类的实例方法中,拿到当前外部类对象,格式为:外部类名.this
2.静态内部类
有static修饰的内部类,属于外部类自己持有
public class Outer{
//静态内部类
public static class Inner{
}
}
静态内部类如何创建对象
Outer.Inner in = new Outer.Inner();
静态内部类中访问其他成员的特点
可以直接访问外部类的静态成员,不可以直接访问外部类的实例成员。
3.局部内部类(了解即可)
定义在方法中、代码块中、构造器等执行体中
4.匿名内部类(重点)
一种特殊的局部内部类;所谓匿名:指的是程序员不需要为这个类声明名字。
new 类或接口(参数值…){
类体(一般是方法重写);
};
//匿名内部类:把这个匿名内部类先编译成一个子类,然后回立即创建一个子类对象
Animal a = new Animal(){
@Override
public void cry() {
System.out.println("猫喵喵喵的叫");
}
};
a.cry();
匿名内部类的特点:
匿名内部类本质就是一个子类,并会立即创建出一个子类对象。
匿名内部类有啥作用,应用场景:
可以更方便的创建出一个子类对象;匿名内部类通常作为一个参数传递给方法。
二、枚举
枚举是一种特殊类
修饰符 enum 枚举类名{
名称1,名称2,名称3,……;
其他成员……;
}
public enum A{
X,Y,Z;
……;
}
注意:
枚举中的第一行,只能写一些合法的标识符(名称),多个名称用逗号隔开。
这些名称,本质是常量,每个常量都会记住枚举类的一个对象。
枚举的特点
1.枚举类的第一行只能罗列一些名称,这些名称都是常量,并且每个常量记住的都是枚举类的一个对象。
2.枚举类的构造器都是私有的(写不写都只能是私有的),因此,枚举类对外不能创建对象。
3.枚举都是最终类(final),不可以被继承。
4.枚举类中,从第二行开始,可以定义类的其他各种成员。
5.编译器为枚举类新增了几个方法,并且枚举都是继承类。
抽象枚举:
public enum B {
X(){
@Override
public void go() {
}
},
Y(){
@Override
public void go(){
}
};
//有参、无参构造器;get、set方法……
三、泛型
定义类、接口、方法时,同时声明了一个或者多个类型变量(如<E>),称为泛型类、泛型接口、泛型方法,统称泛型。
//泛型类
public class ArrayList<E>{
……
}
//泛型接口
public interface A<E>{
……
}
//泛型方法
public static <T> T test(T t){
……
}
作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力,这样可以避免强制类型转换,及其可能出现的异常。
泛型的本质:把具体的数据类型作为参数传给类型变量。
//通配符(?):在使用泛型的时候可以代表一切类型
public static void go(ArrayList<?> cars){
……
}
//上限:(? extends Car):?能接收的必须是Car或者其子类
public static void go(ArrayList<? extends Car> cars){
……
}
//下限:(? super Car):?能接收的必须是Car或者其父类
public static void go(ArrayList<? super Car> cars){
……
}
泛型的注意事项
1.泛型只在编译阶段显示,一旦程序编译成class文件,class文件中就不存在泛型了,这就是泛型擦除。
2.泛型不支持基本数据类型,只能支持对象类型(引用数据类型)
int—Integer、double—Double