| 本帖最后由 心在左边跳 于 2015-7-6 01:02 编辑 
 内部类访问规则
 作用:内部类可以方便访问外部类成员,包括私有。外部类访问内部类,需要建立内部类对象。之所以可以直接访问外部类的成员,因为直接持有外部类引用,格式:Outer.this访问格式:
 当内部类定义在外部类成员位置上,而非私有,可以在外部其他类忠,直接建立内部类对象格式:
 外部类名.内部类名 变量名= 外部类对象.内部类对象;
 Outer.Inner i = new Outer().new Inner();
当内部类定义在外部类成员位置上,就可以被成员修饰符修饰。比如:private ,内部类在外部类中封装。static ,内部类具有static特性。当内部类被static修饰后,只能访问外部类的静态成员。出现访问局限。
 new Outer.Inner().function()(直接访问内部类的非静态成员)
 Outer.Inner.function()(直接访问内部类的静态成员)
 注意:当内部类定义了静态成员,内部类必须时静态的。当外部类的静态方法访问内部类时,内部类必须是静态的。
 
 复制代码/**
 * Created by root on 15-6-14.
 */
public class Outer {
    int x;
    class Inner{
    int x;
        void function(){
        this.x;
        Outer.this.x;//外部类的变量
        }
    }
    void method(){
        Inner inner=new Inner();
        inner.function();
    }
    public static void main(String[]agrgs){
        //内部类全名
        Outer.Inner i = new Outer().new Inner();
    }
}
内部类定义规则
 什么时候使用内部类?当描述事物时,事物中含有事物,该事物使用内部类描述。因为该事物使用外部事物。
 匿名内部类复制代码public class Outer {
    private class Inner{//封装内部类
        void function(){}
    }
    void method(){
        new Inner().function();
    }
内部类定义在局部时,不能被成员修饰符访问。可以访问外部类的成员,因为持有外部类的引用。但是不可访问它所在局部的变量。只能访问被final修饰的成员变量。 
 复制代码public class Outer {
    void method(final int x){
         class Inner{
            void function(){
                System.out.println(x);
            }
        }
        new Inner().function();
    }
    public static void main(String[]agrgs){
        //
        Outer i = new Outer();
        i.method(1);
        i.method(2);
    }
}
 定义匿名内部类前提,内部类必须继承一个类,或者实现接口。格式:new 父类或接口 {定义子类的内容}
 其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。可以理解为带内容的对象。
 匿名内部类中定义方法最好不要超过3个。
 
 复制代码public class Outer {
    int x;
    void method(){
//
        new AbsDemo(){
            @Override
            void show(int x) {
                System.out.print("x="+x);
            }
        }.show(x);
    }
    public static void main(String []args){
        Outer o= new Outer();
        o.x=1;
        o.method();
    }
}
abstract class AbsDemo{
    abstract void  show(int x);
}
//练习
public class Outer {
    public static Inner function(){
        return new Inner() {
            @Override
            public void method() {
                System.out.print("返回匿名内部类");
            }
        };
    }
    public static void main(String[]args){
    //function()运算后是一个对象,而且是一个Inner类对象。所以才调用method()方法
        Outer.function().method();
    }
}
interface Inner{
    void method();
}
 匿名内部类作为方法的参数 复制代码    public static void show(Inner inner){
    //
    }
        Outer.show(new Inner() {
            @Override
            public void method() {
            }
        });
匿名内部类父类为Object 复制代码new Object(){
            public void method(){}
        }.method();
 
 
 |