目录
凡是被static修饰的结构,都是随着类的加载而加载,只加载一次
1、关键字:static
1、static : 静态的
2、static 可以用来修饰 : 属性、方法、代码块、内部类
3、使用static修饰属性:静态变量(类变量)
3.1、属性:按是否使用static修饰,又分为:静态属性 vs 非静态属性(实例变量)
》 实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。
当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。
》静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,
会导致其他对象调用此静态变量时,是修改过了的。
3.2、static修饰属性的其他说明:
静态变量随着类的加载而加载。可以通过"类.静态变量"的方式进行调用
静态变量的加载要早于对象的创建,
由于类只会加载一次,则静态变量在内存中也会存在一份;存在方法区的静态域中。
静态变量是存在方法区的静态域中。
.
4、使用static修饰方法:静态方法
随着类的加载而加载,可以通过 ” 类.静态方法 “ 的方式进行调用
静态方法中,只能调用静态的方法或属性
非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性
.
5、static注意点:
在静态的方法内,不能使用this关键字、super关键字
原因:
this和super指代的是当前对象和父类对象,是在类加载静态结构之后才会new对象,
因为new是在static之后所以无法在静态方法内使用
1.1、类变量(static修饰的)和实例变量的内存解析
栈:存放局部变量
堆:存放new出来的结构; 对象、数组
方法区:类的加载信息、静态域、常量池
结合下图分析:
1、先在方法区里面的静态域中生成nation属性,默认值为null 然后赋值为中国
2、在栈中声明c1 这个局部变量 堆空间中new一个类结构生成一个0x2233的地址值, c1 通过0x2233地址值找到堆空间的结构,给name和age赋值
3、c2 操作类似
4、c1找到静态域的nation 然后将其默认值null改为CHN
5、因为nation是静态变量 随着类加载,只加载一次,所以c2调用的和c1一开始调用的都是静态域里面同一个nation变量,c2将其值改为CHINA。
6、总结:可以看出 类变量和实例变量的赋值操作是有出入的
2、23种设计模式
创建型模式——5种
- 工厂方法模式
- 抽象工厂模式
- 单例模式
- 建造者模式
- 原型模式
结构型模式——7种
- 适配器模式
- 装饰器模式
- 代理模式
- 外观模式
- 桥接模式
- 组合模式
- 享元模式
行为型模式——11种
- 策略模式
- 模板方法模式
- 观察者模式
- 迭代子模式
- 责任链模式
- 命令模式
- 备忘录模式
- 状态模式
- 访问者模式
- 中介者模式
- 解释器模式
3、单例设计模式
单例模式
某个类只能存在一个对象实例
3.1、单例模式如何实现?
饿汉式:
//单例模式——饿汉式
实体类
class Bank{
//1、私有化类的构造器;外部不能new对象
private Bank(){
}
//2、内部创建类的对象;
//4、该类的属性也得是静态的属性,才可以被静态方法调用
private static Bank instance = new Bank();
//3、提供公共的静态方法,返回类的对象
public static Bank getInstance(){
return instance;
}
}
测试类
/*
* 单例模式——饿汉式
* 某个类只能存在一个对象实例
* 如何实现?
* 1、私有化类的构造器;不能让该类在外部实例对象
* 2、内部创建类的对象;因为构造器私有化了,外部不能实例化,只能内部实现
* 3、提供公共的静态方法,返回类的对象;
* 为什么是静态的方法呢?
* 如果不是静态的方法,只能在外部new一个对象才能调用该方法,
* 但是该类的构造器私有化了,外部不能new对象,所以只能通过类名调用该方法。
* 4、要求作为属性的这个instance对象也要是静态的属性;
* 为什么是静态的属性?
* 因为要通过该类中的静态方法去实现实例化,静态方法只能调用静态的属性,所以该属性也必须是静态的属性。
* */
public class SingletonTest1 {
public static void main(String[] args) {
//单例的方式创建对象
Bank instance = Bank.getInstance();
Bank instance1 = Bank.getInstance();
//测试 该类是否是有一个对象实例,,如果结果为true,说明两个对象的地址值是一样的。
System.out.println("饿汉模式:"+(instance == instance1));//饿汉模式:true
}
}
懒汉式:
单例模式——饿汉式
实体类
class Order{
//1、私有化构造器
private Order(){
}
//2、声明当前类对象,先不初始化,要在方法中new对象
//4、此对象也必须声明为static的;——才可以被静态方法调用
private static Order instance = null;
//3、声明公共的、静态的返回当前类对象的方法
public static Order getInstance(){
//为了实现单例的懒汉模式,必须先判断之前该类有没有实例化
//如果为null说明没有实例化,就给他new一个,否则不需要new对象
if (instance == null) {
instance = new Order();
}
return instance