内部类的概念
定义
所谓内部类就是一个类嵌套在另一个类的内部,称这个嵌套类是内部类。
class Outter{
//内部类
class Inner{
}
}
存在的原因
内部类也是封装的一种体现。
心脏类和人这个类的关系就是内部类和外部类的关系;
汽车发动机和汽车类的关系就是内部类和外部类的关系。
内部类的分类
根据定义的位置和关键字,分为四种内部类:成员内部类(类比成员方法)、静态内部类(类比静态方法)、方法内部类、匿名内部类。
成员内部类
1、定义:直接定义在内中,不加static定义的内部类称为成员内部类。
2、内外部类可以访问彼此的私有域
成员内部类默认包含了外部类的对象,可直接调用外部类的成员属性或私有成员属性。
外部类必须通过内部类的对象来访问内部类的私有属性。
3、产生内部类的对象
情况1:在外部类的内部产生内部类的对象。
类名称 引用名称 = new 类名称()
情况2:在外部类的外部产生内部类的对象。
外部类名称.内部类名称 内部类引用 = new 外部类名称().new 内部类名称()
4、成员内部类默认包含了外部类的对象,可直接调用外部类的成员属性,但不能定义静态属性或方法
5、通过内部类来规避单继承局限
静态内部类
1、定义:直接定义在类的内部,使用static关键字修饰的类,称为静态内部类。
2、静态内部类不包含外部类的对象,因此在静态内部类中不能直接访问外部类的成员域,必须通过外部类的对象访问;可以直接访问外部类的静态域。
3、产生静态内部类的对象,
a、在外部类的外部产生
b、在外部类的外部产生静态内部类的对象
外部类名称.内部类名称 内部类引用 = new 外部类名称().内部类名称()
4、在静态内部类中既可以定义静态变量也可以定义成员变量,当成普通类看待。
方法内部类
1、只能定义在方法之中,不能有任何访问修饰符,这个类在方法调用结束之后就会自动销毁,类比方法中的局部变量。
规则1:方法类的内部不能有任何访问修饰符
规则2:方法内部类的声明周期只在方法调用过程中存在,当方法调用结束,方法内部类就会被销毁。方法内部类对方法外部完全隐藏。
规则3:若方法内部类使用方法中的形参,这个参数就必须是形式上的final(JDK8之前,方法内部类使用方法的形参,该参数必须显示定义为final参数)。也就是说在方法内部类中只能访问方法中的参数,不能修改其值;若在方法内部类中调用了方法的形参,在方法中也不能修改这个值。
匿名内部类
1、方法内部类的一种特殊情况,定义在方法之中,主要是在方法的参数上使用,这个类没有名字,一般默认继承一个类或实现一个接口。
2、匿名内部类作为方法的参数
补充:方法的可变参数
实现一个sum方法,能接收任意个整型变量,求这些变量的和。
泛型
在Java中Object是所有类的父类,可以接收所有类型,用户设置时可以设置任意类型,但是取出时可能需要强制类型转换,就会报错,但在编译阶段无法检测,会发生严重的线上问题。引入泛型,将问题暴露在编译阶段。
1、指的是在定义类和方法时,参数的类型暂定,只有在使用时才会明确类型。
语法:
class 类名称<T>{
}
2、泛型类的使用:当要产生泛型类的对象时,此时我们给出明确的类型。
使用时设置具体类型,相应的类型参数就会被替换为当前具体类型
当设置值或取值不是当前类型时,编译出错,将问题暴露在编译阶段。
3、一般来说,泛型的类型参数使用的大写字母:
E:普通元素含义,表示单个泛型元素;
K,V:搭配使用,表示键值对对象;
T:普通泛型类型代号参数;
S:也可指代泛型参数。
当泛型类中需要多个类型参数时,直接在<>内使用’,'分隔,使用不同的大写字母来代替。
泛型方法
1、定义
语法:访问修饰符 [static] <类型参数>方法名称(){}
2、泛型方法始终以自己的类型参数为准,与类中的类型参数无关。因此,若类中存在泛型方法,一般不要使用重复的大写字母。
3、泛型方法可以独立存在,泛型方法所在的类可以不是泛型类
泛型接口
1、定义
2、子类实现泛型接口
a、子类仍然是泛型类,仍然保留泛型接口的类型参数
b、若子类在实现泛型接口时,就明确具体类型
泛型数组
1、不能new 类型参数
的数组,但是可以声明。
2、JVM中没有泛型数组,要使用泛型数组,统一使用Object数组。
3、两种写法的区别