Java之内部类
文章目录
一、什么是内部类
在一个类的内部再定义一个完整的类,内层的类称为内部类。
二、内部类分类
1. 成员内部类
1.1 概念
定义在类的内部,方法的外部的类称为成员内部类。编译后会有外部类$内部类.class文件
1.2 代码形式
class outer{//外部类
class inner{//成员内部类
}
}
1.3 特点
- 成员内部类可以使用任意修饰符(private、[default]、protected、public)
- 成员内部类可以获取父类的所有属性和方法,包括private修饰的。
- 成员内部类中不能包括静态成员(静态变量、静态方法),但可以包含静态常量(staic final)。(JDK16之前版本)
- 成员内部类中属性和外部类的属性同名时,使用外部类名.this.属性访问外部类的属性。
1.4 代码展示
1.4.1 成员内部类创建对象
public class Test{
public static void main(String[] args){
//第一种方式
Outer ou = new Outer();//先创建外部类对象ou
Outer.Inner in = ou.new Inner();//再通过ou创建内部类对象
//第二种方式
Outer.Inner in = new Outer().new Inner();//将上面两行代码合成一行
}
}
1.4.2 成员内部类访问属性
class Outer{
String name = "张三";
int age = 15;
class inner{
String name = "李四";
int age = "23";
//inner属性
System.out.printf("姓名:%s 年龄:%d\n",name,age);
//outer属性
System.out.printf("姓名:%s 年龄:%d\n",outer.this.name,outer.this.age);
}
}
输出结果:
姓名:李四 年龄:23
姓名:张三 年龄:15
2. 静态内部类
2.1 概念
用static修饰的成员内部类
2.2 代码形式
class Outer{//外部类
static class Inner(){//静态内部类
}
}
2.3 特点
- 静态内部类可以使用任意访问修饰符(private、[default]、protected、public)。
- 静态内部类易于创建对象。
- 静态内部类可以创建静态成员。
- 静态类不能创建实例成员(实例变量、实例方法)。
2.4 代码展示
2.4.1 创建对象
public class Test{
public static void main(String[] args){
Outer.Inner in = new Outer.Inner();//创建对象
}
}
3. 局部内部类
3.1 概念
定义在方法中的类,使用范围仅限方法内部。
3.2 代码形式
class Outer{//外部类
public void method(){//外部类方法
class inner{//局部内部类
}
}
}
3.3 特点
- 局部内部类不能使用任何修饰符。
- 局部内部类是否能获取外部类的成员取决于所在方法是否为静态(static)的。
①.静态方法(static):
可以访问外部类的静态成员(静态变量、静态方法),实例成员需要创建对象调用。
②.实例方法
可以访问外部类的所有成员。 - 局部内部类可以访问所在方法的局部变量,但是局部变量只能是常量(final),JDK1.8版本及以后fianl可以省略不写(不代表不用)。
- 局部内部类不能声明静态成员(静态变量、静态方法),可以使用静态常量(static final)。
3.4 代码展示
3.4.1 创建对象
class Outer{//外部类
public void method(){//外部类方法
class Inner{//内部类
}
Inner in = new Inner();//创建对象
}
}
4. 匿名内部类
4.1 概念
舍弃类名的局部内部类,必须继承父类或者实现接口,有两种定义形式。
4.2 代码形式
interface MyInterface{//一个接口
}
class MyClass{//一个类
}
class Outer{//外部类
public void method(){//外部类方法
//1. 第一种定义方式
//1.1 继承父类
MyClass in1 = new MyClass(){//匿名内部类,通过父类引用(MyClass)创建对象in1
//方法体
}
//1.2 实现接口
MyInterface in2 = new MyInterface(){//匿名内部类,通过接口引用(MyInterface)创建对象in2
//方法体
}
//2. 第二种定义方式
//2.1 继承父类
MyClass in3 = () -> {//匿名内部类,使用“->”,省略了new和父类名
//方法体
}
//2.2 实现接口
MyInterface in4 = () ->{//匿名内部类,使用“->”,省略了new和接口名
//方法体
}
}
}
4.3 特点
- 创建匿名内部类时,必须实现接口,或继承父类。
- 匿名内部类的对象数量有且只能有一个。
- 匿名内部类不能手动添加构造方法,不能包含静态成员。
- 匿名内部类中的属性和方法需要使用对象来调用。
- 匿名内部类生成的class文件名:外部类名&编号.class
总结
本人第一次写博客,如果哪里有问题,请多担待,欢迎评论区讨论~