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;
    }
}

你可能感兴趣的:(java的内部类)