一 匿名内部类 可看做实参
1 概念
匿名内部类:就是没有名字的类
2 匿名内部类特点
1 一般方法参数需要接收一个接口类型的数据,那么我们调用的时候 需要传入对应的实现类对象
2 此时可以直接传入一个匿名内部类,匿名内部类就等于是子类
3 匿名内部类没有名字不能重复使用,类名为 外部类类名$1 . . 以此类推
4 匿名内部类中 不能有静态声明,但是可以声明常量(public static final)
5 不能直接调用外部类的成员属性,需要对象 才行
例子
public class OuterClass_04 {
public static void main(String[] args) {
UserService userService=new UserServiceImpl();//多态 UserService为接口,UserServiceImpl为接口的实现类
UserServiceImpl userServiceImpl=new UserServiceImpl();//普通调用
userServiceImpl.login();
m1(userService);
//匿名内部类
m1(new UserService() {
@Override
public void login() {
System.out.println("登录失败!!!");
}
});
}
public static void m1(UserService userService){
userService.login();
}
}
interface UserService {
public void login();
}
//普通实现类
class UserServiceImpl implements UserService{
@Override
public void login() {
System.out.println("登录成功!!!");
}
}
二 设计模式
2.1 什么是设计模式
什么是设计模式:设计模式 代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用,设计模式是软件开发人员在软件开发过程中 面临的一般问题的解决方案 .这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
2.2 单例模式
2.2.1 单例模式概念
让某个类只创建一个对象,可以避免垃圾回收问题,例如Windows中的任务管理器,只能打开一个,打开多了造成资源浪费
2.2.2 实现方式
1 实例化对象,需要调用构造方法,想要控制创建对象的数量,
第一步就是不能让别的人创建对象,就意味着不能让别的类访问构造方法构造方法私有化.
2 提供一个用于获取当前类对象的静态方法
上面已经把构造方法私有化了,用户创建不了对象了,那么我们需要提供一个方法用于获取对象
那么该方法一定是公共的静态方法, 如果是成员方法,必须得现有对象才能调用,而该方法就是用 来获取对象的 , 想要获取对象,必须先提供静态方法
3 保证只有一个实例
数据不存储不能重复使用,所以为了保证对象的唯一性,必须先准备一个 变量用于存储这 个对象
变量声明 : 数据类型 变量名 = 值;
值 就是对象
变量名 无所谓
数据类型 SingLeton_01 当前类类型
2.2.3 为什么要是用静态变量保存对象?
1 如果是成员变量 : 必须用对象调用,在静态方法中不能直接使用,而我们的方法是静态方法,所以不 能直接操作成员变量
2 如果是局部变量 : 方法执行完,就销毁,每次调用该方法的时候,变量重新执行初始化一次,导致建 多个对象
3 如果是静态变量 : 整个程序生命周期中,只会初始化一次,符合单例模式的需求
2.2.4 构造方法是步骤:
1 构造方法私有化
2 提供一个静态变量用来保存类对象
3 提供一个静态方法,用来获取当前类对象
2.2.5 单例模式分类
根据对象的创建时机不同,分为两类
1 饿汉模式 : 类加载完之后,就立刻创建对象
2 懒汉模式 : 第一次用到的时候 在创建对象
饿汉模式:
//饿汉模式
public class SingLeton_01 {
//1 构造方法私有化
private SingLeton_01(){
}
//2 提供一个静态变量用来保存类对象
public static SingLeton_01 s=new SingLeton_01();
//3 提供一个静态方法,用来获取当前类对象
public static SingLeton_01 geObject(){
return s;
}
}
懒汉模式 :
//懒汉模式
public class SingLeton_02 {
// 1 构造方法私有化
private SingLeton_02(){
}
// 2 提供一个静态变量来保存对象
public static SingLeton_02 s2;
// 3 提供一个静态方法,用来获取当前类对象
public static SingLeton_02 geObject(){
if(s2==null){
s2=new SingLeton_02();
}
return s2;
}
}
以上两个在代理类中运行:
代理类如下:
package day_06._02_SingLeton;
public class Client {
public static void main(String[] args) {
SingLeton_01 s1=SingLeton_01.geObject();
System.out.println(s1);
System.out.println(SingLeton_01.geObject());//静态方法用类名.方法名调用
System.out.println(SingLeton_01.geObject());
System.out.println(SingLeton_01.geObject());
System.out.println(SingLeton_01.geObject());
System.out.println(SingLeton_01.geObject());
System.out.println(SingLeton_01.geObject());
System.out.println("========================");
System.out.println(SingLeton_02.geObject());
System.out.println(SingLeton_02.geObject());
System.out.println(SingLeton_02.geObject());
System.out.println(SingLeton_02.geObject());
System.out.println(SingLeton_02.geObject());
System.out.println(SingLeton_02.geObject());
}
}
//输出的都是同一个对象