内部类就是在class再定义一个class。什么时候用呢? 分析事物时,发现该事物描述中还有事物,而且这个事物还在访问被描述事物的内容。,这时就是还有的事物定义成内部类来描述。
内部类访问特点
Ⅰ.内部类可以直接访问外部类的成员
Ⅱ.外部类要访问内部类,必须建立内部类的对象
1 //定义一个内部类的实例 2 public class InnerClassDome { 3 public static void main(String[] args) 4 { 5 new Outer().method(); 6 } 7 } 8 9 class Outer 10 { 11 private int num = 3; 12 //内部类 13 class Inner 14 { 15 public void show() 16 { 17 System.out.println("run show..."); 18 } 19 } 20 21 //定义一个访问内部类的方法 22 public void method() 23 { 24 Inner inner = new Inner(); 25 inner.show(); 26 } 27 }
1 //直接访问内部类 2 public class InnerClassDome { 3 public static void main(String[] args) 4 { 5 new Outer().method(); 6 } 7 } 8 9 class Outer 10 { 11 private int num = 3; 12 //内部类 13 class Inner 14 { 15 public void show() 16 { 17 System.out.println("run show..."); 18 } 19 } 20 21 //定义一个访问内部类的方法 22 public void method() 23 { 24 //直接访问内部类 25 Outer.Inner in = new Outer.Inner(); 26 in.show(); 27 } 28 }
// 如果内部类是静态的,相对于一个外部类 //想初始化内部类必须是静态的 public class InnerClassDome { public static void main(String[] args) { //如果内部类是静态的,相对于一个外部类 //注意:如果调用静态内部类的方法,方法里引用了有外部类的变量,该变量必须为静态,不然会报错。 Outer.Inner in = new Outer.Inner(); in.show(); //如果内部类是静态的,成员也是静态的,可以直接这样用 Outer.Inner.function(); } } class Outer { private int num = 3; //静态内部类 static class Inner { void show() { System.out.println("run show..."); } static void function()//如果内部中定义了静态成员,该内部类也是必须是静态的 { System.out.println("run function..."); } } public void method() { Inner inner = new Inner(); inner.show(); } }
为什么内部类能直接访问外部类的成员呢?那是内部类持有了外部类的引用。“外部类名.this”
1 public class InnerClassDome { 2 public static void main(String[] args) 3 { 4 new Outer().method(); 5 } 6 } 7 8 class Outer 9 { 10 int num = 5; 11 class Inner 12 { 13 int num = 6; 14 void show() 15 { 16 int num = 7; 17 System.out.println(num);//输出7 18 System.out.println(this.num);//输出6 19 System.out.println(Outer.this.num);//输出5 20 } 21 } 22 23 public void method() 24 { 25 new Inner().show(); 26 } 27 }
//内部类可以存放在局部位置上 public class InnerClassDome { public static void main(String[] args) { new Outer().method(); } } class Outer { private int num = 3; public void method() { class Inner { int num = 4; void show() { int num = 5; System.out.println("show ... " + num);//输出5 System.out.println("show ... " + this.num);//输出4 System.out.println("show ... " + Outer.this.num);//输出3 } } Inner inner = new Inner(); inner.show(); } }