标题@内部类和单利模式
匿名内部类
匿名内部类:在方法的调用的时候,需要传入一个类的对象,这个时候可以直接传入一个匿名内部类
一般该对象是接口的实现类对象,匿名内部类等于是子类,可以使用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;
}
}