匿名内部类
匿名内部类:在方法的调用的时候,需要传入一个类的对象,这个时候可以直接传入一个匿名内部类
一般该对象是接口的实现类对象,匿名内部类等于是子类,可以使用super等关键字
语法:方法(new 父类/接口(){类体})
匿名内部类,会自动创建一个对象传入
好处少定义一个类,缺点无法重复使用
public class _04_OuterClass { public static void main(String[] args) { // UserLoginImpl userLoginImpl = new UserLoginImpl(); // test(userLoginImpl); //这个内部匿名类能充当接口的对象了 //接口本身是不能创建对象的 test(new UserLogin() { public void login(String username, String password) { if (username.equals("admin")) { if (password.equals("root")) { System.out.println("成功"); } else { System.out.println("密码不正确"); } } else { System.out.println("用户名不正确"); } } }); } public static void test(UserLogin userLogin) { //接口的的引用类型只有两种 // null 子类对象 userLogin.login("admin", "root"); } } interface UserLogin { public void login(String username, String password); }
单例模式: * 实例化很多次,得到同一个对象,让某个类只能被实例化一 * 实现步骤: * 现在需要控制创建对象的数量,只有一个,所以就不能让用户决定创建或者不创建 * 1 不能让用户创建对象 * 创建对象需要调用构造方法,如果不让用户创建对象,也就意味着不能让用户访问构造方法 * 所以 构造方法 需要私有化 * 2 我们创建一个给他,并且只创建一次即可 * 上面已经把构造方法私有化了,就意味着用户创建不了对象了 * 那么这个时候,我们必须提供一个让用户能够获取对象的一个方法 * 既然是获取对象的方法,那么这个方法一定是静态方法 * 3 存储对象的变量 * 变量不存储,不能重复使用,所以为了保证对象只有一个,我们肯定是创建对象之后,进行重复使用 * 局部变量:具有临时性,方法执行完后就不存在了,下一次调用方法是时,变量初始化 * 成员变量:静态方法中不能操作成员变量 * 静态变量:和类相关,和类声明周期一致 * 所以应该创建一个用来保存当前类对象的静态变量 * 总结: * 1构造方法私有化 * 2提供一个私有的静态的用来保存当前类对象的静态变量 * 3提供一个公共的静态方法,来获取该对象 * * 根据创建对象的时机不同,分为两种 * 1 懒汉模式 * 用到的时候再创建对象,也就是第一次获取的时候 * 2 饿汉模式 * 类加载 的时候就立刻创建对象 * * 懒汉模式和饿汉模式的区别: * 1内存角度 * 懒汉模式要好一些,用到的时候再创建,一般叫做懒加载/迟加载 * 饿汉模式浪费内存,还没用就创建了 * 2 线程安全角度 * 饿汉模式是再类加载阶段就初始化的,所以再多线程环境下没有问题,因为类只会加载一次 * 懒汉模式是再多线程并发性的情况下,就不行了,可能创建多个对象,但是可以通过双重校验枷锁解决 * 所以 一般我们使用懒汉模式居多,尽管在多线程下,也使用懒汉模式,使用双重校验枷锁解决并发问题即可
//饿汉 public class Singleton_01 { private static Singleton_01 singleton_01 = new Singleton_01(); private Singleton_01() { //private不让用户调用 } public static Singleton_01 getInstance() { return singleton_01; } } //懒汉 public class Singleton_02 { private Singleton_02() { } private static Singleton_02 s; public static Singleton_02 getInstance() { if (s == null) { s = new Singleton_02(); } return s; } }