面向对象所需要的知识
static
static是静态变量,可以修饰成员变量、成员方法。
使用方法:类名.类变量,对象.类变量。
成员变量的执行原理
类变量:属于类,与类一起加载一次,在内存中只有一份,可以 被类和类的对象所有。
成员变量:属于对象,每个对象都有一份,只能用对象访问
使用场景
如果某个数据只需要一份,且希望能够被共享(访问、修改),则数据可以定义成类变量来记录。
成员方法的执行原理
类方法可以通过对象和类访问,而实例方法只能通过对象访问。
使用场景
作为工具类使用
工具类:工具类中的方法都是一些类方法,每个方法都是用来完成一个功能的,工具类是给开发人员共同使用的。
好处:提高了代码复用;调用方便,提高了开发效率。
为什么工具类中的方法要用类方法,而不用实例方法
- 实例方法需要创建对象来调用,此时对象知识为了调用方法,对象占内存,这样会浪费内存。
- 类方法,直接用类名调用即可,调用方便,可以节省内存。
- 工具类没有创建对象的需求,建议将工具类的构造器进行私有。
static的注意事项
- 类方法中可以直接访问类的成员,不可以直接访问实例成员,因为实例成员属于对象。
- 实例方法中可以直接类的成员和实例成员。
- 实例方法中可以出现this关键字,类方法中不可以出现this关键字,因为this是要获得当前对象的。
代码块
- 代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类)。
代码块分为两种
- 静态代码块
- 格式: static{}
- 特点:类加载是自动执行,由于类只会加载一次,所以静态代码块也只会执行一次
- 作用:完成类的初始化,例如:对类变量的初始化赋值
如下图
Tips :如何分页显示文件--右键点击需要分页的文件名,选择split vertically或者Split Horizontally就可以同时显示两个页面啦
- 实例代码块
- 格式:{}
- 特点:每次穿管对象是,执行实例代码块,并在构造器前执行
- 作用:和构造器一样,都是来完成对象的初始化的,例如:对实例变量的初始化赋值。
static的应用知识——单例设计模式
什么是设计模式 ?
单例设计模式
- 确保一个类只有一个对象
1.饿汉式单例模式
写法
- 把类的构造器私有。
- 定义一个类变量记住类的一个对象。
- 定义一个类方法,返回对象。
代码示例
package com.zz.staticSingleInstance;
public class A {
//单例三部曲 ,这样就可以实现单例模式
//2.定义一个类变量记住类的一个对象
private static A a = new A();
//1.必须私有类的构造器
private A(){
}
//3.定义一个类方法返回类的对象
public static A getObject(){
return a;
}
}
测试类
package com.zz.staticSingleInstance;
public class Test {
public static void main(String args[]){
A a1 = A.getObject();
A a2 = A.getObject();
System.out.println(a1);
System.out.println(a2);
}
}
执行结果:
应用场景
如任务管理器,可以避免浪费内存。
2.懒汉式单例设计模式
- 拿对象时,才开始创建对象
写法
- 把类的构造器私有
- 定义一个类变量用于存储对象
- 提供一个类方法,保证返回的是同一个对象
代码实现
package com.zz.staticSingleInstance;
public class B {
//懒汉式单例设计模式
//2.定义一个类变量来存储类的一个对象
private static B b;
//1.将构造器私有
private B(){
}
//3.定义一个类方法,保证第一次调用才创建一个对象,返回的是同一个对象
public static B getInstance(){
if(b == null){
b = new B();
System.out.println("第一次创建对象");
}
return b;
}
}
测试
package com.zz.staticSingleInstance;
public class Test2 {
public static void main(String args[]){
B b1 = B.getInstance();
B b2 = B.getInstance();
System.out.println(b1 == b2);
}
}
结果