26-28 内部类

http://baike.baidu.com/view/7942850.htm?fr=aladdin

1、内部类就是在一个类的内部定义的类。
2、内部类中不能定义静态成员(方法体外定义的static nested class可以定义静态成员)

3、内部类可以直接访问外部类中的成员变量(static nested class不能访问外部类中的非static成员变量)

4、内部类可以定义在外部类的方法外面,也可以定义在外部类的方法体中。

(1)方法体外

  类前修饰可以public,protect,default,private(可以使用static,final,abstract),决定对其他类是否可见。

(1-1)方法体外的内部类,类似成员变量。创建内部类的实例对象时,一定要先创建外部类的实例对象,然后用它去创建内部类的实例对象。

(1-2)方法体外的内部类加上static,成为static nested class,不再具有内部类特性。狭义上说,它不是内部类,与普通类在运行时的行为和功能无区别,只是编译引用时的语法有区别。

    可定义为4中访问权限类型,而普通类只有两种类型(public和默认)。
    引用static nested class的名称为“外部类.内部类”,不需创建外部类实例
    能直接访问外部类的static成员变量,不能直接访问外部类的非static成员变量。
     可以定义static成员变量。

    

(2)方法体中

  类前修饰不能有4种访问类型修饰符(不可以使用static是因为方法体内局部变量也不可以是static的,可使用final或abstract),对其他类不可见。先定义后使用,只能在方法中实例化。

  可以访问方法体中的final修饰的局部变量。方法中的final局部变量放在堆中,而非栈中。

(2-1)方法体中的内部类,类似局部变量。

(2-2)static方法体中的内部类也是static nested class。这是不能在类前面加static,它与普通方法中的内部类应用相似。
    可以访问静态方法中final修饰的局部变量,还可以直接访问外部类中的static成员变量,不能直接访问外部类的非static成员变量

(2-3)方法体中可以创建匿名内部类。即定义某一接口或类的子类的同时,还创建了该子类的实例对象,无需为该子类定义名称。匿名内部类必须继承其他类或实现其他接口。

public class Outer {
    static int x = 0;
    int y = 0;
    public void fun1(){
        x=1;
        y=1;
        class C{//(2-1)方法体中的内部类,类似局部变量,前面不能有4种访问类型修饰符(可使用final或abstract),对其他类不可见。先定义后使用。
            //这种内部类可以访问方法体中的final修饰的局部变量。
            //static int i = 0;//static不行,static final可以
            public void cFun(){
                x=4;
                y=4;
            }
        }
        C c = new C();
      //(2-3)方法体中可以创建匿名内部类
        new Thread(new Runnable(){
                        public void run(){
                        }
                   }
                   ).start();
    }
    
    public static void fun2(){
        x=1;
        class D{//(2-2)static方法体中的内部类也是static nested class。这是不能在类前面加static
            //静态方法中的static nested class与普通方法中的内部类应用相似。
            //除了可以直接访问外部类中的static成员变量,还可以访问静态方法中final修饰的局部变量。
            //static int i = 0;//static不行,static final可以
            public void dFun(){
                x=5;
                //y=5;y不是static的,在static nested class中不可访问
            }
        }
        D d = new D();
    } 
    public class A{//(1-1)方法体外的内部类,类似成员变量,4种访问权限来修饰决定对其他类是否可见
        //static int i = 0;//static不行,static final可以
        public void aFun(){
            x=2;
            y=2;
        }
    }
    public static class B{//(1-2)方法体外的内部类加上static,成为static nested class,不再具有内部类特性。
        //狭义上说,它不是内部类,与普通类在运行时的行为和功能无区别,只是编译引用时的语法有区别。
        //可定义为4中访问权限类型,而普通类只有两种类型(public和默认)
        //引用static nested class的名称为“外部类.内部类”,不需创建外部类实例。
        //能访问外部类的static成员变量
        static int i = 0;//可以定义static成员。
        public void bFun(){
            x=3;
            //y=3;y不是static的,在static nested class中不可访问
        }
    }
    public static void main(String[] args){
        A a = new Outer().new A();
        Outer.B b1 = new Outer.B();
        B b2 = new B();//外部类中可以省略外部类名
    }
}

 

 编译结果:

 

  

 

posted @ 2014-08-25 15:57  seven7seven  阅读(214)  评论(0编辑  收藏  举报