内部类
- 内部类是什么
- 内部类的类别
- 成员内部类
- 静态内部类
- 匿名内部类
内部类是什么
示例
package day20191106;
public class InClass {
/**
*类似这种的类就叫做内部类,顾名思义,就是存在于类内部的另一个类
*/
class InnerClass{
}
}
内部类的类别
-
成员内部类:地位相当于成员变量、成员方法
- 内部类的使用与外部类相似,但需要注意的是内部类中不能有static修饰的内容
- 内类中可以继续写内部类,但是一般不这么写
-
静态内部类
-
匿名内部类(最常见,最实用)
-
局部内部类(已被淘汰)
成员内部类
成员内部类是什么
示例
package day20191106;
public class ClassExample {
public class InnerClass{
public InnerClass(){
}
public int a;
public int b;
public void method1(){
}
public void method2(){
}
}
}
成员内部类的构造
- 有构造器
- 有变量
- 有方法
- 有代码块
- 可以使用外部类的属性和方法
注意:成员内部类中不能有static修饰的内容,因为成员内部类是对象内部的一个成员,对象被创建后才会有成员内部类
成员内部类的对象创建
- 方式1
package day20191106;
//导入内部类
import day20191106.ClassExample.InnerClass;
public class Demo03 {
public static void main(String[] args) {
//创建外部类对象
ClassExample classExample = new ClassExample();
//使用外部类对象创建出内部类对象,方式与调用成员属性、方法相同
InnerClass inner = classExample.new InnerClass();
}
}
- 方式2
package day20191106;
public class Demo03 {
public static void main(String[] args) {
ClassExample classExample = new ClassExample();
ClassExample.InnerClass inner = classExample.new InnerClass();
}
}
注意1:创建出内部类对象后,可以像普通对象一样调用内部的属性和方法
静态内部类
静态内部类是什么
static修饰的成员内部类,示例如下:
package day20191106;
public class ClassExample {
public static class InnerClass{
public InnerClass(){
}
public int a;
public int b;
public void method1(){
}
public void method2(){
}
}
}
静态内部类的特殊点
不能调用外部类的非静态属性、方法,其他与成员内部类相同
静态内部类的对象创建
package day20191106;
public class Demo03 {
public static void main(String[] args) {
InnerClassB innerB = new ClassExample.InnerClassB();
}
}
匿名内部类
匿名内部类是什么
一次性使用的一个实例化对象
匿名内部类的作用
实现一个接口或者继承一个抽象类
匿名内部类的示例
package day20191106;
public class Demo03 {
public static void main(String[] args) {
//必须是抽象类或者接口
InterClass interClass = new InterClass(){
@Override
public void method1() {
// TODO Auto-generated method stub
}
@Override
public void method2() {
// TODO Auto-generated method stub
}
};
}
}
匿名内部类的使用
- 可以使用局部变量,局部变量必须被final修饰
- 可以使用成员变量,成员变量无须被final修饰
注意:
- JDK1.8及以上版本:即使被调用的局部变量没有被final修饰,也会默认添加final
- JDK1.8以下版本:必须写明局部变量由final修饰,否则无法调用