Java中的内部类又分为非静态内部类(匿名内部类也是非静态的内部类)和静态内部类,两者与外部类的关系是不一样的,创建的方式也不一样。
1 非静态内部类
Java的非静态内部类在构造的时候,会将外部类的引用传递进来,并且作为内部类的一个属性,因此,内部类会隐式地持有其外部类的引用。也就是非静态内部类在构造的时候需要有一个外部类的实例传递进来进行构造,不能像普通的Java类那样直接就可以通过 new来生成;一个简单的例子如下:
1 import java.util.ArrayList;
2 import java.util.LinkedList;
3 import java.util.List;
4 import java.util.Queue;
5 import java.util.Scanner;
6
7 public class Main {
8
9 /**
10 * @param args
11 */
12 public int k=3;
13 private static String string="Java";
14 protected float j=1.5f;
15 public static void show(){
16 System.out.println("show");
17 }
18 private void add(){
19 System.out.println("add");
20 }
21 public static void main(String[] args) {
22 // TODO Auto-generated method stub
23 Main m=new Main();
24 //合法的非静态内部类的构造方式
25 Child c=m.new Child();
26 //Child c=new Child() 这是不合法的构造方式
27 c.test();
28
29 }
30 //内部类Child
31 class Child{
32 public int i;
33 public void test(){
34 System.out.println("k=:"+k);
35 System.out.println("string:"+string);
36 add();
37 System.out.println("j=:"+j);
38 show();
39 }
40
41 }
42
43 }
并且非静态的内部类可以访问外部类的所有成员变量与方法,包括静态的成员变量与方法,执行内部类Child的test()方法就可以得到下面的结果:
1 k=:3
2 string:Java
3 add
4 j=:1.5
5 show |