美文网首页
java的内部类

java的内部类

作者: slicn | 来源:发表于2018-02-07 14:53 被阅读0次

    前言

    面向对象程序设计中,可以在一个类的内部定义另一个类(静态嵌套类和非静态嵌套类)。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(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的内部类

          本文链接:https://www.haomeiwen.com/subject/jtmszxtx.html