Static是什么
- 静态成员变量(有static修饰、属于类、内存中只加载一次):常表示如在线人数信息,等需要被共享的信息、可以被共享访问
访问方式:类名.静态成员变量(非常推荐)public class User{
//静态成员变量
public static String onlineNumber = 100;
}
对象名.静态成员变量(不推荐)两种成员变量各自在什么情况下定义?
- 静态成员变量:表示在线人数等需要被共享的信息
- 实例成员变量:属于每个对象,且每个对象的该信息不同时(如:name.age,money…等)
static修饰成员变量的内存原理
总结:在类加载的时候静态成员变量就加载到了堆内存中,在访问的时候可以通过类名访问,也可以通过对象名访问。
static修饰成员方法的基本使用
定义的方法加static修饰和不加static修饰有什么区别
public void run(){
System.out.println("XXXXXXX");
}
public static int getmax(int a ,int b){
return a>b?a:b;
}
成员方法的分类
- 静态成员方法(有static修饰,归属于类),建议用类名访问,也可以用对象访问。
- 实例成员方法(无static修饰,归属于对象),只能用对象触发访问。
使用场景:
- 表示对象自己的行为的,且方法中需要访问实例成员的,则该方法必须声明成实例方法
-
static修饰成员方法的内存原理
Static访问注意事项
静态方法只能访问静态的成员,不可以直接访问实例成员
- 实例方法可以访问静态的成员,也可以访问实例成员
- 静态方法是不可以出现this关键字的,因为不是到是对象名.静态方法还是类名.静态方法。
Static应用知识:工具类
工具类是什么?
- 类中都是一些静态方法,每个方法都是以完成一个共有的功能为目的,这个类用来给系统开发人员共同使用的。
使用工具类的好处
一是调用方便,二是提高了代码复用(一次编写,处处可用)
为什么工具类中的方法不用实例方法做?
- 实例方法需要创建对象调用
- 此时用对象只是为了调用方法,这样只会浪费内存
工具类定义时的其他要求:
- 由于工具里面都是静态方法,直接使用类名即可访问,因此,工具类无需创建对象,建议将工具类的构造器设置为私有的。
Static应用知识:代码块
代码块的分类、作用
代码块的概述
- 代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类),定义在类中方法中
- 在java类中,使用{}括起来的代码称为代码块
代码块分为
- 静态代码块
格式:static{}
特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发,只执行一次
使用场景:在类加载的时候做一些静态数据初始化的操作,以便后续使用。
构造代码块
**格式:{}**<br />** 特点:**每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且在**构造器执行前**执行<br />** 使用场景:**初始化实例资源
注:静态代码块比main函数先加载,所以在执行的时候先运行静态代码块的内容。
静态代码块的作用?
如果要在启动系统时对静态资源进行初始化,则建议使用静态代码块完成数据的初始化操作、
静态代码块的应用知识:单例设计模式
什么是设计模式(Design pattern)
- 开发中经常会遇到一些问题,一个问题通常有n种解法,但其中肯定有最优的,这个最优的解法被人总结出来了,称之为设计模式
单例模式
- 可以保证系统种,应用该模式的这个类永远只有一个实例,即一个类永远只创建一个对象
- 例如任务管理器对象我们只需要一个就可以解决问题了,这样可以节省内存空间。
饿汉单例模式
- 在用类获取对象的时候,对象就给你创建好了。
设计步骤:
- 定义一个类,把构造器私有
定义一个静态变量存储一个对象
public class SingleInstance{
//定义一个静态变量存储一个对象即可:属于类,与类一起加载
public static SingleInstance = new SingleInstance();
//单例必须私有构造器
private SingleInstance(){
System.out.println("创建一个对象");
}
}
懒汉单例模式
懒汉单例设计模式
在真正需要该对象的时候,才去创建一个对象(延迟加载对象)
设计步骤:
- 定义一个类,把构造器私有
- 定义一个静态变量存储一个对象
public class SingInstance2{
//定义一个静态成员变量负责存储的一个对象,只加载一个,只有一份
public static SingInstance2 instance;
//提供一个方法,对外返回单例对象
public static SingleInstance2() getinstance(){
if(instance == null){
instance = new SingleInstance2();
}
return instance;
}
//私有构造器
private SingleInstance2(){
System.out.println("xxxxxx");
}
}