顾名思义就是在一个类(方法的内部在定义一个了类)
实例内部类:
定义在类内部的类
class Outer {
public int data = 1;
public static int a = 10;
class inner {
public int m = 7;
public String str = "dfdf";
public void test() {
System.out.println(data);
System.out.println(str);
}
}
}
public class Test {
public static void main(String[] args) {
Outer.inner in = new Outer().new inner();
in.test();
}
}
1 实例化内部类对象
外部类名.内部类名 变量 = new 外部类().new 内部类();
2 在生成的字节码文件当中格式名为 外部类名$内部类名
3 在实例内部类当中,不能定义静态的成员变量
可以用static final 定义常量
4 若内部类中的变量和外部类的成员变量同名,则调用内部类的成员变量 (若非要调用外部类的同名变量则需要进行如图操作)
静态内部类:
定义在类内部的类,并且被static 关键字所修饰
class Outer {
public int data = 1;
public static int a = 10;
public int b = 10;
static class inner {
public int m = 7;
public String str = "dfdf";
public int b = 9;
public void test() {
}
}
}
public class Test {
public static void main(String[] args) {
Outer.inner in = new Outer.inner();
in.test();
}
}
- 获取静态内部类对象
Outer.inner in = new Outer.inner();
外部类.内部类 变量名 = new 外部类.静态内部类();
- 字节码文件和实例内部类一样
- 在静态内部类当中,不可以访问外部类的非静态数据成员 原因:外部类的非静态数据成员 是依赖于外部类对象的
- 若要在静态内部类当中访问外部类的非静态成员变量
匿名内部类
没有名字的内部类
class Outer {
public int data = 1;
public static int a = 10;
public int b = 10;
public void fun() {
System.out.println("play code");
}
}
public class Test {
public static void main(String[] args) {
new Outer() {
@Override
public void fun() {
System.out.println("df - nb");
System.out.println(data);
}
}.fun();
}
}
在匿名内部类当中,使用的变量,或者是常量 或者是在整个过程当中 不能发生改变
本地内部类
定义在方法内部的类
ublic class Test {
public void A(){
class b{
//本地内部类
}
}
}