zoukankan      html  css  js  c++  java
  • 3)Java学习笔记:内部类

    什么是内部类

    内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)。内部类主要有以下几类:成员内部类、局部内部类、静态内部类、匿名内部类

    为什么要使用内部类

    ①内部类提供了更好的封装,除了该外围类,同一个包下的其他类都不能访问
    ②内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体
    ③内部类可以对同一个包中的其他类隐藏起来,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
    ④可以实现多继承
    ⑤当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷

    内部类特性

    ①内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号
    ②内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量
    ③外部类不能直接访问内部类的的成员,但可以通过内部类对象来访问
    ④内部类可以自由地访问外部类的成员变量,无论是否是private的
    ⑤因为当某个外围类的对象创建内部类的对象时,此内部类会捕获一个隐式引用

    实现多重继承

    class Eat {
        public void eat() {
            System.out.println("eat()");
        }
    }
    
    class Drink {
        public void drink() {
            System.out.println("drink()");
        }
    }
    
    public class MutiExtend {
        private EatExtra eat = null;
        private DrinkExtra drink = null;
    
        MutiExtend() {
            eat = new EatExtra();
            drink = new DrinkExtra();
        }
    
        public void drink() {
            drink.drink();
            System.out.println("drinkExtra()");
        }
    
        public void eat() {
            eat.eat();
            System.out.println("eatExtra()");
        }
    
        private class EatExtra extends Eat {
            
            // inner class can not have static declaration
    //        static int age;
            // allowed,因为在compile阶段就已经确定了
            static final int name = 123;
            @Override
            public void eat() {
                super.eat();
            }
        }
    
        private class DrinkExtra extends Drink {
            @Override
            public void drink() {
                super.drink();
            }
        }
    }
    

    注意事项

    ①内部类不能定义静态成员变量和方法
    ②内部类访问外部类实例用: 外部类名.this.变量名
    ③创建内部类: outerClassInstane.new InnerClass()

    局部内部类

    ①不能范围该方法的非final局部变量
    ②不可以定义静态变量

    静态内部类

    ①要创建嵌套类的对象,并不需要其外围类的对象

    一种比较好的用法

    public class AuthModule {
    
    //    private static int SUCCESS = 200;
    //    private static int FAIL = 400;
    
        // 比这种实现要好很多吧,但是只限于是该类的状态,这样可以有命名空间Status
        private static class Status {
            private static int SUCCESS = 200;
            private static int FAIL = 400;
        }
    
        public void doSomething() {
            System.out.println(Status.SUCCESS);
            System.out.println(Status.SUCCESS);
        }
    }
    
  • 相关阅读:
    谷歌技术"三宝"之BigTable
    谷歌技术"三宝"之谷歌文件系统
    谷歌技术"三宝"之MapReduce
    大话存储
    ASP.NET之旅--深入浅出解读IIS架构
    好网站
    ArcGIS API for Silverlight学习资料积累
    浏览器滚动条快到底部时自动加载数据
    MVC EF中Attach和Entry区别
    微信开发jssdk入门
  • 原文地址:https://www.cnblogs.com/human/p/5117342.html
Copyright © 2011-2022 走看看