java的内部类

前言

面向对象程序设计中,可以在一个类的内部定义另一个类(静态嵌套类和非静态嵌套类)。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。内部类是JAVA语言的主要附加部分。内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同一级,或处于方法之内,甚至是一个表达式,完善了多种继承、实现了事件驱动、闭包。

  1. 内部类只在第一次使用的时候加载。
  2. 非静态类内部不能出现静态模块(方法,属性,代码块)
  3. 非静态类的使用需要借助外部类的对象。
  4. 内部类拥有外围类所有元素的访问权限

好处详解

  1. 内部类实现了隐藏式封装,可以对外部类有不可见性
  2. 实现多继承

实例

  1. 隐藏行为,以借钱为例
定义借钱的接口
public interface IMoney {
    void lendMoney();
}
实现类

public class IMoneyImpl implements IMoney {
    @Override
    public void lendMoney() {
        System.out.println("没有钱了");
    }
}
主人
public class Owner {
    public IMoney lend(boolean canPay){     //如果能还我就借或者我愿意我就借
        if (!canPay) return new IMoneyImpl();
        return null;
    }
}

测试代码
如果不熟我就不借,会有如下代码
@Test
    public void test(){
       IMoney i = new Owner().lend(false);    //不借
       i.lendMoney();
    }

  i 就是一个不肯借钱的实例(暴露接口),但是他不想你知道,伤和气。把接口隐藏到Owner内部就可以解决这个问题如下:
public class Owner {

    //内部类隐藏接口
    private  class RealLend implements IMoney{

        @Override
        public void lendMoney() {
            System.out.println("可以借钱");
        }
    }
    public class FalseLend implements IMoney{

        @Override
        public void lendMoney() {
            System.out.println("不可以借钱");
        }
    }
}

测试
    @Test
    public void test2(){
        Owner owner = new Owner();
        Owner.FalseLend falseLend = owner.new FalseLend();    //需要外围类的对象。隐藏了接口
        falseLend.lendMoney();
    }
  1. 利用内部类第一次调用的时候加载的特性实现优雅的单利模式
/**
 * Created by: jun on 2018/2/7.
 * description: 内部类实现优雅的单利模式
 */
public class Singleton1 {
    private Singleton1(){};

    private static class SingletonHoder{
        private static Singleton1 instance = new Singleton1();
    }

    public static Singleton1 getInstance(){
        return SingletonHoder.instance;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,778评论 18 399
  • 1.使用内部类的原因:a.内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据b. 内部类可以对同一个包...
    这是朕的江山阅读 215评论 0 0
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,556评论 25 708
  • 你说 我睡觉是因为下午要听课 我答 我睡觉是因为昨晚睡得少 其实 睡觉是因为 我不开心 心理老师说 不开心你就睡觉...
    可爱蛋黄派阅读 530评论 0 1
  • 既然已经下定决心投身到产品经理的火坑,那就必然是要从分析产品开始的,正好昨天参加了一个公司协办的徒步活动,那就尝试...
    Abe_Yan阅读 247评论 0 1