内部类

成员内部类

当成外部类的一个属性

1, 私有变量变得不“私有”了,访问起来很方便

public class Outter {
    private String outName = null;
    public void fun() {
        // 内部类(别的类可以直接使用私有变量)
        class Inner{
            public void getInfo() {
                System.out.println(outName);
            }
        }
    }
}

2, 在内部内中this指向外部类,“外部类.this”指向内部类

3, 实例化内部类:外部类.内部类 对象名 = new 外部类().new 内部类()

public class Outter {
    class Inner{
        public void sayHi() {
            System.out.println("hi...");
        }
    }
    public static void main(String[] args) {
        /*
         * 类型:外部类.内部类
         * 先new外部类,再new内部类
         * */
        Outter.Inner innerc = new Outter().new Inner();
        innerc.sayHi();
    }
}

4, private内部类:该内部类不能实例化

5, static内部类:在该内部类中同样不能访问静态变量和方法

6, 实例化static内部类:外部类.内部类 对象名 = new 外部类.内部类()

public class Outter {
    static class Inner{
        public void sayHi() {
            System.out.println("hi...");
        }
    }
    public static void main(String[] args) {
        /*
         * 类型:外部类.内部类
         * 访问静态变量,再new
         * */
        Outter.Inner innerc = new Outter.Inner();
        innerc.sayHi();
    }
}

 局部内部类

在方法中定义

不能直接使用方法的变量和参数(JDK1.8以下需使用fina修饰方法变量)

public class Outter {
    public static void main(String[] args) {
        String funName= null;
        class Inner{
            // 内部类成员变量,用来传递方法变量
            String innerName = null;
            public void getInfo() {
                // 直接使用方法变量,报错
                name= "Marry"; 
                // 把方法变量赋值给内部成员变量就可以使用了
                innerName = funName;
            }
        }
    }
}

匿名内部类

1,不能有构造函数

2,不能有静态成员变量或方法

3,属于局部内部类

  new 父类构造器(参数列表)|实现接口() {  
     //匿名内部类的类体部分  
    }

常用语swing编程或多线程

    new Thread() {
            int num = 5;
            public void run() {
                while(num > 0){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    num--;
                    System.out.println("线程A:" + num);
                }
            }
        };
原文地址:https://www.cnblogs.com/huanggy/p/9190199.html