单例模式
单例模式:保证类只能存在一个对象
懒汉式:调用功能的时候才创建对象
饿汉式:类第一次加载完成之后就创建对象
当多个人同时调用静态方法时,懒汉容易创建不同对象
实现步骤:
- 构造器私有化
- 私有的静态的该类的引用
- 公共的访问方式
//饿汉式
public class Single01{
private static Single01 single = new Single01();//私有的静态的该类的引用
//构造器私有化
private Single01(){}
public static Single01 newInstance(){//公共的访问方式
return single;
}
}
//懒汉式
public class SingleTon02{
//私有的静态的该类的引用
private static SingleTon02 single = null;
//构造器私有化
private SingleTon02(){}
public static SingleTon02 newInstance(){公共的访问方式
if(single==null){
single = new SingleTon02();
}
return single;
}
}
静态代理
静态代理:
- 真实角色需要和代理角色实现相同的接口
- 代理需要持有真实角色的引用
- 代理行为
优点:
减少与真实角色的交流,提高代码的安全行,解耦,便于后期维护,代理角色可以扩展功能
简单工厂
让汽车厂生产汽车
内部类
内部类:类中定义类
当一个类中的成员也是另外一个事物的时候,这个事物就 可以使用内部类定义
分类:
成员内部类
局部内部类
静态内部类
私有内部类
匿名内部类
成员内部类:
内部类处于外部类成员位置
是外部的成员,就可以使用成员修饰符
是个类,有类的特性,继承,实现接口。。。
注意:
- 内部类中可以使用外部类中所有的内容,包括私有的
- 除了静态内部类以外的内部类不可以定义静态的内容,除了静态的常量
- 在外部类中使用内部类中的成员,通过内部类的对象
- 在其他类中使用内部类中的成员,需通过外部类的对象生成内部类对象
- 内部类成员变量覆盖外部成员变量,通过外部类.this.成员变量获得外部类成员变量
静态内部类
成员内部类如果一旦被static关键字修饰,就是静态内部类
注意:
-
如果在外部类中使用静态内部类中的成员,需要跟随内部类对象使用,如果使用静态内部类中的静态内容,直接类名.调用
-
如果在静态内部类中使用外部类的成员,需要跟随外部类对象使用,如果使用外部类中的静态内容,可以直接使用
-
在其他类中调用静态内部类中的成员,需要创建对象:
外部类.内部类 引用名 = new外部类.内部类;
在其他类中调用静态内部类中的静态内容:
外部类.内部类.静态内容;
私有内部类
成员内部类一旦被private修饰,就是私有内部类
私有内部类只能在当前所定义的外部类中使用,其他类中无法使用
在外部类中可以通过内部类的对象使用内部类中的内容,包括私有的
局部内部类
局部内部类只能在当前所在的方法中使用,其他方法,其他类无法使用
当前所在的方法需通过内部类的对象来访问内部类的成员内容
局部内部类中使用到当前所在方法的参数时,这个参数默认被final修饰
如果修改就不能在局部内部类中使用
如果在局部内部类中使用就不能修改其参数的值
匿名内部类
如果某个实现类本身没有自己的作用,只是为了重写某些抽象方法的,可以使用匿名内部类进行代替
Lambda表达式
jdk1.8的新特性
作用:用来简化匿名内部类
前提:函数式接口
函数式接口:只有一个抽象方法的接口就是函数式接口
检查函数式接口:@FunctionalInterface
Lambda表达式1:
p = ()->{system.out.println("111");};
Lambda表达式2:如果方法体只有一句,可以省略{};
p = ()->system.out.println("222");
Lambda表达式3:参数可以省略数据类型
p = (i)->system.out.println("333");
Lambda表达式4:如果只有一个参数,可以省略()
p = i->system.out.println("444");
Lambda表达式5:如果方法体只有一句,且是return ,可以同时省略return和{}; ,但是不可以只省略return
p = i->555;