Java知识点总结:想看的可以从这里进入
目录
2.2.4、 内部类1、成员内部类2、静态内部类3、局部内部类4、匿名内部类2.2.4、 内部类
一个类定义在另一个类内,那么这个类就是一个内部类,比如:在类A中定义一个类B,B就是内部类,而B可以当做A的一个成员看待。从种类上说,内部类可以分为四类:成员内部类、静态内部类、匿名内部类、局部内部类。
1、成员内部类
成员内部类:最普通的一种内部类,定义在类中方法外的一个普通的类(没有static修饰),可用任意的修饰符修饰
内部类可以访问外部类所有的属性和方法(包括私有)。但是外部类要访问成员内部类的属性和方法,必须要先实例化内部类
在其他的类中使用内部类时,需要先有外部类的对象(成员内部类是依附外部类而存在的)
关于在成员内部类中使用静态方法和属性的问题: 关于JDK16后可以在非静态内部类中使用静态属性和方法的说明
在 jdk16之前的版本,不能再非静态成员内部类中定义静态的属性和方法
在 jdk Java16之后的版本是可以定义静态方法和属性的
当外部类变量与方法和内部类的同名时,内部类默认访问自己的成员变量或方法,而要引用外部变量时要加类名.this(类名.this.变量名、类名.this.方法名())
2、静态内部类
静态内部类:静态内部类就是在成员内部类加了一个 static 关键字,静态内部类就像外部类的一个静态成员一样
静态内部类不能直接访问外部类的非静态成员,但可以通过创建外部类的对象访问
外部类的静态成员与内部类的成员名称相同,可通过(类名.静态成员) 访问外部类的静态成员
静态内部类创建对象无需依赖外部类,可以直接创建
3、局部内部类
局部内部类:使用的比较少,声明在方法体或一段代码块的内部。
仅在定义的方法、代码块内部使用,其他地方无法使用(定义在方法内则只能在方法中使用,定义在for循环中则只能在for循环中使用),作用范围类似于局部变量
局部内部类不可使用权限修饰符 静态(static)修饰符进行修,但可以使用final 或 abstract修饰。
局部内部类可以直接访问方法中的属性
局部内部类创建对象要在方法内部、局部内部类的外部声明。
可以访问外部类的的属性和方法(包括私有的)。
4、匿名内部类
匿名内部类:很常用。它是一种没有名字的内部类,只能使用一次,通常是某个类在实现时只会使用一次,所以为了简化,不需要去专门写一个实现类,而是直接使用内部类完成。
匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。在匿名内部类中可以使用外部类的属性,但是外部类却不能使用匿名内部类中定义的属性,匿名内部类没有名字,因此在外部类中无法获取这个类的类名,也就无法得到属性信息。(只能有一个对象)匿名内部类必须继承父类或实现接口,使用多态形式引用
new 接口/类名(参数1, 参数2...){实现方法1(){}实现方法2(){}......};
在线程的时候通常就喜欢使用匿名内部类实现