标签:类对象 javap inner lol new 编译 通过 直接 zab
Java中一直对实例内部类和静态内部类特别混淆,对它能的实例化总是容易忘记,随着对java的不断学习,终于有了自己的理解,因此分享自己的心得:
先看代码
public class OuterClass {
class Inner {
}
static class Inner2 {
}
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
// 创建实例内部类
Inner inner1 = outerClass.new Inner();
// 创建静态内部类
Inner2 inner2 = new OuterClass.Inner2();
}
}
分析:我们创建实例内部类时,必须要用到外部类具体的实例对象,就好像实例内部类依附在外部类的实例上。
在创建静态内部类时,可以直接使用外部类来创建静态内部类的对象,就好像是静态内部类依附在外部类上。
把上面代码编译后后生成三个字节码文件,分别为外部类,实例内部类,和静态内部类的字节码文件,如下:
经javap
反编译后可可知,在实例内部类中有外部类实例的引用,而在静态内部类没有外部类实例的引用。
因此可以证明实例内部类内有外部类对象的引用。
再来看看静态内部类与实例内部类访问外部类的的属性,
public class OuterClass {
static int a = 0;
int b = 0;
class Inner {
int a1 = a;
int b1 = b;
}
static class Inner2 {
int a2 = a;
int b2 = b;//Non-static field 'b' cannot be referenced from a static context
}
}
在静态实例内部类中可以访问外部类的实例变量和静态变量,而在静态内部类中可以访问外部类的静态变量,但不能访问实例变量。
PS:通过不断的学习,感觉内部类与外部类的方法有种若隐若现的联系,如果把上面代码中的,如果建立这样一种对应关系,实例内部类——>>>实例方法,静态内部类——>>>静态方法(仅仅为了理解),是不是很容易就能理解内部类调用外部类实例变量与静态变量的过程。
标签:类对象 javap inner lol new 编译 通过 直接 zab
原文地址:https://www.cnblogs.com/minghaiJ/p/11384605.html