根据内部类的位置不同,可将内部类分为
1. 成员内部类
2. 局部内部类
class C{ //成员内部类 class B{ } public void show1() { //局部内部类 class D{ } } }
成员内部类
成员内部类的访问格式:
1 外部类名.内部类名 对象名=外部类对象.内部类对象
1 class C{ 2 3 //成员内部类 4 class B{ 5 public void show() 6 { 7 System.out.println("你好"); 8 } 9 } 10 } 11 public class niming { 12 public static void main(String[]args) { 13 14 //创建对象访问对应内部类函数成员 15 C.B b=new C().new B(); 16 b.show(); } 17 }
虽然内部类可以以上述方式访问,但实际开发中,常将内部设为私有成员,以保护数据的安全,不让外部直接使用
1. 将内部类设为私有成员
1 class C{ 2 //成员内部类,设为私有 3 private class B{ 4 public void show() 5 { 6 System.out.println("你好"); } 7 } 8 public void show1() { 9 B b=new B(); 10 b.show(); } 11 } 12 public class niming { 13 public static void main(String[]args) { 14 //创建对象访问对应内部类函数成员 15 C c=new C(); 16 c.show1(); 17 } 18 } 19
2. 将内部类设为静态类
特定:静态内部类访问外部类成员时,只能访问外部类的静态成员
1 class C{ 2 //静态成员变量 3 private static int num=20; 4 //静态成员方法 5 public static void show2() { 6 System.out.println("hello world"); 7 } 8 //成员内部类,设为私有静态 9 private static class B{ 10 public void show() { 11 System.out.println(num); 12 show2(); 13 } 14 } 15 public void show1() { 16 B b=new B(); 17 b.show(); 18 } 19 } 20 public class niming { 21 public static void main(String[]args) { 22 //创建对象访问对应内部类函数成员 23 C c=new C(); 24 c.show1(); 25 } 26 }
局部内部类
可以直接访问外部类的成员
内部类访问的外部变量必须定义为 final 或 static 类型
1 public class Outer{ 2 public void inner(){ 3 final int num = 5; 4 class InnerClass{ 5 private int num = 4; 6 public void testNum(){ 7 System.out.println(this.num); 8 } 9 } 10 } 11 }
首先,内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而跟随者被销毁。问题就来了,如果外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量肯定也就被GC了,然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中,这样的话,由于final所修饰的值始终无法改变,所以这个变量所指向的内存区域就不会变。