1. 什么是内部类?
在一个类 A 中,又定义了一个类 B ,此时这个类 B 就是内部类,而类 A 则是外部类!内部类也是一种封装得表现
public class A{
class B{
}
}
我们看上面代码,此时 A 就是外部类,B 就是内部类
- 内部类和外部类共用同一个java源文件,但是经过编译之后,内部类会形成单独的字节码文件
- 定义在class 类名{}花括号外部的,即使是在一个文件里,都不能称为内部类
2. 内部类的分类
内部类又分为成员内部类和局部内部类 下面我们来一一介绍下
2.1 成员内部类
2.1.1 静态内部类
我们先来看是如何定义的
class OuterClass{
static class InnerClass{
}
}
此时的 InnerClass 就是静态内部类,因为被 static 修饰
既然是一个类,那么应该如何 来实例化一个静态内部类呢?
public class Test{
public static void main(String[] args){
OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
}
}
那么在静态内部类种,如何访问自己的成员变量和外部类的成员变量呢?
从图种,我们可以直接看出,当访问外部类 data1 和 data2 的时候,编译报错了,这是为什么呢? 因为 data1 和 data2 是属于外部类的,不是静态的,而所有静态的都不依赖于对象,如果要访问,必须得用对象得引用才能够访问到。
我们再来想下,如何在外部类中访问内部类的成员变量和自己的成员变量?
从上图种可以看出,要想访问 data4 和 data5 ,就必须创建对象,用对象的引用才能访问,data5 是静态的,可以直接通过类名访问!
总结:
- 在静态内部类当中,不能直接访问外部类当中的非静态成员,如果想访问,必须实例外部类,然后通过对象的引用来访问
- 创建静态内部类对象时,不需要先创建外部类对象
2.1.2 非静态内部类
所谓非静态内部类,就是未被static修饰的成员内部类。
class OuterClass{
class InnerClass{
}
}
那么我们如何来实例非静态内部类呢?
public class Test {
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
}
可以看出我们实例内部类之前,需要得到外部类的对象,才能够创建实例内部类
那么在非静态内部类中,如何访问自己的成员变量和外部类的成员变量呢?
可以看出外部类中的任何成员都可以在实例内部类方法中直接访问
在外部类中,又如何访问外部类成员变量和内部类成员变量呢?
可以看出来,需要先创建 内部类对象,通过引用才能访问 data4 和 data5. 而通过类名就可以访问 data6.
我们再来思考一个问题,当 外部类和内部类 出现同名变量时,应该是访问哪个,答案肯定是就近原则!
在非静态内部类中,包含了两个this,一个是外部类的 this,一个是非静态内部类的 this
在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称.this.同名成员 来访问
2.1.3 局部内部类
定义在外部类的方法中!
- 局部内部类只能在所定义的方法体内部使用
- 不能被public、static等修饰符修饰
- 编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class
- 几乎不会使用
2.1.4 匿名内部类
那么上面就定义了一个匿名的内部类,那么如何调用呢?
通过直接 .fuc() 就能够调用
3. 结尾
以上就是介绍了! 如果有不了解,或者错误的地方,请批评指正!!