本文共 2955 字,大约阅读时间需要 9 分钟。
要获取实例内部类的对象,通常需要以下步骤:
外部类类名.内部类类名 变量 = 外部类对象的引用.new 内部类()例如:
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
外部类类名.内部类类名 变量 = 外部类对象的引用.new 内部类() 不能定义非静态属性或方法
实例内部类的非静态数据成员必须在编译期间就能确定。只能定义static final
的属性或 static
方法。内存开销
实例内部类包含外部类的this
引用,因此至少占用两个 this
,存在内存开销。public class OuterClass { public int data1 = 1; private int data2 = 2; int data3 = 3; public static int size = 10; public OuterClass() { System.out.println("OuterClass()"); } class InnerClass { public int data4 = 4; public static final int size = 10; public int data1 = 11; public InnerClass() { System.out.println("InnerClass()"); } public void test() { System.out.println("data1=" + data1); // 11 System.out.println("OuterClass的data1=" + OuterClass.this.data1); // 1 System.out.println("InnerClass的test()方法"); } }}public class TestDemo { public static void main(String[] args) { OuterClass outerClass = new OuterClass(); OuterClass.InnerClass innerClass = outerClass.new InnerClass(); System.out.println(innerClass.data4); // 4 innerClass.test(); }}
静态内部类的对象获取方式类似于实例内部类:
静态内部类对象 = new 静态内部类();例如:
OuterClass2.InnerClass2 innerClass2 = new OuterClass2.InnerClass2();
不能访问外部类的非静态成员
如果需要访问外部类的非静态成员,需要传入外部类对象引用。没有外部类的 this
引用
this
引用。public class OuterClass2 { public int data1 = 1; private int data2 = 2; int data3 = 3; public static int data5 = 10; public OuterClass2() { System.out.println("OuterClass2()"); } static class InnerClass2 { public int data1 = 4; public static final int data5 = 5; OuterClass2 outerClass; InnerClass2() { System.out.println("static的InnerClass2()"); } InnerClass2(OuterClass2 outerClass2) { this.outerClass = outerClass2; System.out.println("static的InnerClass2()"); } public void test() { System.out.println("data1=" + this.outerClass.data1); // 1 System.out.println("data1=" + data1); // 4 System.out.println("data5=" + data5); // 5 System.out.println("data5=" + OuterClass2.data5); // 10 System.out.println("InnerClass2的test()方法"); System.out.println("InnerClass2的test()方法"); } }}public class TestDemo1 { public static void main(String[] args) { OuterClass2.InnerClass2 innerClass2 = new OuterClass2.InnerClass2(); System.out.println(innerClass2.data1); // 4 OuterClass2 outerClass2 = new OuterClass2(); OuterClass2.InnerClass2 innerClass21 = new OuterClass2.InnerClass2(outerClass2); innerClass21.test(); }}
实例内部类和静态内部类都是外部类的常见内部类类型。实例内部类包含外部类的 this
引用,而静态内部类不含。理解这两种内部类的性质对于优化内存占用和正确使用内部类有重要意义。
转载地址:http://xbrnz.baihongyu.com/