内部类

来源:互联网 发布:python抓取网易云音乐 编辑:程序博客网 时间:2024/06/13 08:20

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

内部类的分类
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 类名或者接口名() { 重写方法; } 本身就是使用完就结束

0 0