在学习内部类之前我们首先要知道内部类的概念: 在一个类的内部再定义一个完整的类
内部类的特点:
- 编译之后可生成独立的字节码文件
- 内部类可直接访问外部类的私有成员,而不破坏封装
- 可为外部类提供必要的内部功能组件
内部类的分类:
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
成员内部类
- 在类的内部定义,与实例变量,实例方法同级别的类
- 外部类的一个实例部分,创建内部内对象时,必须依赖外部类对象:
Outer out = new Outer();
Inner in = out.new Inner;
或者
Outer.Inner in = new Outer().new Inner();
- 当外部类、内部类存在重名属性时,会优先访问内部类属性
System.out.println("Outer.this.name")
- 成员内部类不能定义静态变量
源码展示:
public class Outer {
private String name = "张三";
private int age = 20;
// 内部类
class Inner {
private String address = "中国";
private String name = "李四";
// 打印成员变量
public void print() {
System.out.println(Outer.this.name);
System.out.println(Outer.this.age);
System.out.println(this.address);
System.out.println(this.name);
}
}
}
public class Application {
public static void main(String[] args) {
Outer.Inner inner = new Outer().new Inner();
inner.print();
}
}
静态内部类
- 不依赖外部类对象,可以直接创建或通过类名访问,可声明静态成员
- 只有内部类才能使用static修饰
- 只能直接访问外部类的静态成员(实例成员需实例化外部类对象)
Outer.Inner inner = new Outer.Inner();// 只创建了静态内部类的对象,没有创建外部类(Outer)对象 Outer.Inner.show();
源码展示:
public class Outer {
private String name = "张三";
private int age = 20;
// 内部类
static class Inner {
private String address = "中国";
private String name = "李四";
// 打印成员变量
public void print() {
// 打印外部类信息
// 1.创建外部类对象
Outer outer = new Outer();
// 2.调用外部类对象的属性
System.out.println(outer.name);
System.out.println(outer.age);
// 打印静态内部类信息
System.out.println(this.address);
System.out.println(this.name);
}
}
}
public class Application {
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner();
inner.print();
}
}
局部内部类
- 定义在外部类方法中,作用范围和创建对象范围仅限于当前方法
- 局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,如果为JDK1.7则需要将该局部变量修饰为final,往后版本则不用
- 可以用来限制类的范围
源码展示:
// 外部类
public class Outer {
// 外部类成员变量
private String name = "张三";
private int age = 18;
// 内部类方法
public void show() {
String address = "中国";
class Inner {
private String sex = "男";
// 内部类方法打印信息
public void print() {
// 打印内部类信息
System.out.println(this.sex);
// 打印局部变量
System.out.println(address);
// 打印外部类成员变量
System.out.println(Outer.this.name);
System.out.println(Outer.this.age);
}
}
Inner inner = new Inner();
inner.print();
}
}
public class Application {
public static void main(String[] args) {
Outer outer = new Outer();
outer.show();
}
}
匿名内部类
- 没有类名的局部内部类(一切特征都与局部内部类相同)
- 必须继承一个父类或者实现一个借口
- 定义类、实现类、创建对象的语法合并,只能创建一个该类的对象
- 优点:减少代码量
- 缺点:可读性较差
源码展示:
public class Application {
public static void main(String[] args) {
// 局部内部类
class Apparatus implements UsbService {
@Override
public void mouse() {
System.out.println("鼠标连接电脑成功");
}
}
//创建Apparatus对象apparatus
Apparatus apparatus = new Apparatus();
//调用mouse方法
apparatus.mouse();
}
}
public interface UsbService {
void mouse();
}
以上内容就是我对于四大内部类的总结,如果您觉得写得还可以,不妨给个小小的赞,如果您觉得这篇文章有什么问题,欢迎在下方留言^^