一.内部类
内部类;类体中有同一个类的声明
当一个事物的内部还有一部分需要一个完整的结构进行描述,这个内部的完整结构,一般只是为了让外部类使用
而内部类中还有一个作用是可以访问外部类中的私有化属性
分类:
成员变量----->成员内部类/普通内部类
可以等同看做成成员变量,类体中不用static修饰的
可以使用权限控制修饰符
成员内部类中 不能有静态声明
成员内部类中,可以直接访问外部类的所有属性
内部类的类名 外部类$内部类内部类
静态变量----->静态内部类
静态内部类等同于静态变量
可以用权限控制符修饰
静态内部类中可以声明所有属性 静态和成员都可以
静态内部类中可以直接访问外部类的静态属性,不能直接访问成员属性(有对象就可以访问了)
局部变量------>局部内部类
局部内部类等同于局部变量
局部内部类,不能有静态声明
局部内部类不能使用static修饰符
如果外部方法是静态方法,则内部类不能直接访问外部类的成员属性
如果外部方法是成员方法,则局部内部类中了以直接访问外部类的所有属性
局部内部类中如果要使用外部方法中的局部变量,则该变量必须使用final修饰(1.8开始,final可以省略)
形参/实参-->匿名内部类
匿名内部类:在方法中调用的时候,需要传入一个类的对象,这时候可以直接传入一个匿名内部类
一般该对象,是接口实现类对象,匿名内部类等于是子类,可以使用super等关键字
语法:方法(new父类/接口(){类体});
匿名内部类,会自动创建一个对象传入
好处,少定义一个类 缺点,无法重复使用
二.设计模式
1.单例模式:实例化多次得到同一个对象,让某个类只能被实例化一次
实现步骤:现在需要控制创建对象的数量,只有一个,所以就不能让用户决定创建或者不创建
1.不能让用户创建对象
创建对象需要调用构造方法,如果不让用户创建对象,也就意味着不能让用户访问构造方法所以构造方法需要私有化
2.我们创建一个给他并且只创建一次即可
上面已经把构造方法私有化了,也就意味着用户创建不了对象了
那么现在这个时候,我们必须提供一个用户能够获取对象的一个方法
既然是用于获取对象的方法,那么这个方法一定是静态方法
如果成员方法的话,调用该方法需要用到对象,而获取这个对象需要调用这个方法
3.存储对象的变量
变量不存储,不能重复使用,为了保证变量值只有一个,我们肯定需要创建对象之后,进行重复使用
局部变量:具有临时性,方法执行完后就不存在了,下一次调用该方法时 ,变量重新初始化
成员变量:静态方法中不能操作成员变量
静态变量:和类相关,和类生命周期一致
所以应该创建一个用来保存当前类对象的静态变量
总结:分为三步
1.构造方法私有化
2.提供一个私有的静态的用来保存当前类对象的静态变量
3.提供一个公共的静态方法,用来获取该对象
根据创建对象的时机不同,分为两种
1.懒汉模式:用到的时候在创建对象也就是第一次获取到时候
2.饿汉模式:类加载的时候就立刻创建对象
懒汉模式和饿汉模式的区别:
1.内存角度:懒汉模式要好一些,用到的时候在创建使用,一般叫懒加载/迟加载
饿汉模式浪费内存,还不用呢,对象就已经先创建了
2 线程安全角度
饿汉模式是在类加载阶段就初始化的,所以在多线程环境下没有问题,因为类在生命周期中只会加载一次
懒汉模式在多线程并发性的情况下,就不行了,可能创建多个对象,但是可以通过双重校验加锁解决
所以 一般我们使用懒汉模式居多,尽管在多线程下,也使用懒汉模式,使用双重校验加锁解决并发问题即可