定义:
            类内部定义的类
内部类的访问规则
           可以直接访问外部类的成员,包括私有
           外部类要想访问内部类成员,必须创建对象

内部类的分类
1):成员内部类:在成员变量或者成员方法位置定义的类
        成员静态内部类:
              外部类名.内部类名 对象名 = new 外部类名.内部类名();
        成员非静态内部类:
              外部类名.内部类名 对象名 = new 外部类名.new 内部类名();
        private定义的成员内部类,不能直接访问,需要通过方法获取该类的对象
        static 定义的类,可以看做外部类的成员变量;

2):局部内部类:在局部位置定义的类
局部内部类
        局部内部类访问局部变量必须加final修饰 。
原先如下:
        局部内部类定义在局部,而局部随着方法的消失而消失,局部定义的变量存储在栈中,随着方法调用结束而释放,但是类是在堆中,局部内部类调用局部变量,但是局部内部类发现找不到对应的变量了,所以我们要在局部内部类访问局部变量必须加final修饰 ,这样修饰后的变量还是存储在内存中,可以让局部内部类调用



public class Test {

    private String name = "lisi";
    private static String passw = "lisi";

    // 成员内部类
    class People {
        public void method() {
            System.out.println("成员非静态内部类");
            System.out.println("可以访问外部name:" + name);

        }
    }

    // 成员内部静态内部类,可以看做外部类成员
    static class SuperPeople {
        public void method() {
            System.out.println("成员静态内部类");
            System.out.println("可以访问外部passw:" + passw);

        }
    }

    // private 成员内部类
    private class UserPeople {
        public void method() {
            System.out.println("private成员内部类");
        }
    }

    public UserPeople getUserPeople() {
        return new UserPeople();
    }

    //
    public void method3() {
        //局部内部类
         final String pass="hello";//局部内部类访问局部变量必须用final修饰
        class Woman {
            public void method() {
                //
                System.out.println("局部内部类"+name);
                System.out.println("局部内部类访问局部变量必须用final修饰:"+pass);
            }
        }
        //为了调用局部内部类方法
        Woman woman=new Woman();
        woman.method();


        //匿名内部类
          new  HmanDao(){
            @Override
            public void login() {
                System.out.println("匿名内部类HmanDao");
            }
        }.login();

        //匿名内部类
          new  Hman(){
                public void method() {
                    //
                    System.out.println("匿名内部类Hman");
                }
        }.method();
    }



    public static void main(String[] args) {
        System.out
                .println("----------------访问成员非静态内部类方法-----------------------------");
        // 访问成员非静态内部类
        Test.People up = new Test().new People();
        up.method();
        System.out
                .println("----------------访问成员静态内部类方法-----------------------------");
        // 访问成员静态内部类
        Test.SuperPeople up2 = new Test.SuperPeople();
        up2.method();
        System.out
                .println("----------------访问成员private内部类方法---------------------");
        // 访问成员private内部类
        UserPeople up3 = new Test().getUserPeople();
        up3.method();
        // 局部内部类
        System.out.println("-------------访问局部内部类方法--------------------");
        Test test = new Test();
        test.method3();
    }
}

interface HmanDao {
    public  static  final int num = 1;//; only public, static & final are permitted
    public void login();
}

class Hman {
    public void method() {
        System.out.println("Hman类");
    }
}
输出:
----------------访问成员非静态内部类方法-----------------------------
成员非静态内部类
可以访问外部name:lisi
----------------访问成员静态内部类方法-----------------------------
成员静态内部类
可以访问外部passw:lisi
----------------访问成员private内部类方法---------------------
private成员内部类
-------------访问局部内部类方法--------------------
局部内部类lisi
局部内部类访问局部变量必须用final修饰:hello
匿名内部类HmanDao
匿名内部类Hman


3匿名内部类
         A:是局部内部类的简化形式
         B:前提:存在一个类或者接口
         C:格式:
         new 类名或者接口名() {
         重写方法;
         }
         D:本质:
         其实是继承该类或者实现接口的子类匿名对象
(8)匿名内部类好处
随着方法的介绍而结束; new 类名或者接口名() { 重写方法; } 本身就是使用完就结束

posted on 2017-04-02 21:08  2637282556  阅读(137)  评论(0编辑  收藏  举报