前言
面向对象程序设计中,可以在一个类的内部定义另一个类(静态嵌套类和非静态嵌套类)。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。内部类是JAVA语言的主要附加部分。内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同一级,或处于方法之内,甚至是一个表达式,完善了多种继承、实现了事件驱动、闭包。
- 内部类只在第一次使用的时候加载。
- 非静态类内部不能出现静态模块(方法,属性,代码块)
- 非静态类的使用需要借助外部类的对象。
- 内部类拥有外围类所有元素的访问权限
好处详解
- 内部类实现了隐藏式封装,可以对外部类有不可见性
- 实现多继承
实例
- 隐藏行为,以借钱为例
定义借钱的接口
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();
}
- 利用内部类第一次调用的时候加载的特性实现优雅的单利模式
/**
* 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;
}
}
网友评论