static修饰成员变量
- 叫静态,可以修饰成员变量、成员方法
成员变量按照有无static修饰,分为两种:
- 类变量(有static修饰):被类中所有对象共享
- 实例变量(对象的变量):属于每个对象
推荐:
类名.类变量对象.实例变量
//Test.java
public class Test{
public static void main(String[] args){
//目标:掌握有无static修饰成员变量的用法,特点
1、类变量的用法
//类名.类变量(推荐)
Student.name = "Sangria";
//对象.类变量(不推荐)
Student s1 = new Student();
s1.name = "桑格利亚";
Student s2 = new Student();
s2.name = "谢必安";
System.out.printIn(s2.name);//输出谢必安
//实例变量的用法,属于每个对象的变量
//对象.实例变量
s1.age = 200;
s2.age = 8;
System.out.printIn(s1.age);
//输出200
System.out.printIn(s2.age);
//输出8
}
}
//Student.java
public class Student{
static String name; //类变量
int age;
}
成员变量的执行原理
1、存储位置:成员变量属于对象实例,当通过new创建对象时,所有成员变量会随对象一起分配在堆内存中
2、初始化顺序:成员变量在对象创建时会被赋予初始值(由JVM自动完成),如果在声明时直接赋值,这个操作会在构造函数执行前完成,构造函数赋值:构造函数的赋值会覆盖前两步的值
3、访问机制:通过对象引用访问成员变量时,JVM会根据对象的堆内存地址定位成员变量的具体位置。静态变量(static)属于类,存储在方法区,所有对象共享同一份数据,通过类名直接访问
关键:成员变量的生命周期与对象绑定,其值由JVM默认初始化——显式赋值——构造函数赋值逐步确定,访问时依赖对象的内存地址
static修饰成员变量的应用场景
- 在开发中,如果某个数据只需要一份,且希望能够被共享(访问,修改),则该数据可以定义成类变量来记住
//系统启动后,要求用户类可以记住自己创建了多少个用户对象
public class User{
public static int number;//类变量
public User(){//直接让构造器+就行
User.number++;
}
}
static修饰成员方法
类方法
有static修饰的成员方法,属于类
使用方法:
类名.类方法(推荐)对象名.类方法(不推荐)
实例方法
无static修饰的成员方法,属于对象
Java中的main方法是程序的唯一入口点,当程序启动时,JVM会自动寻找并执行它。其固定写法是`public static void main(String[] args)`:`public`表示公开访问,`static`使方法无需创建对象即可调用,`void`表示无返回值,`String[] args`用于接收命令行参数。例如执行`java MyClass hello`时,`args`数组会包含字符串"hello"。任何独立运行的Java类都必须包含这个特定签名的main方法。
static修饰成员方法的应用场景
- 类方法最常见的应用场景是做工具类
- 工具类是什么:工具类中的方法都是一些类方法,每个方法都是用来完成一个功能的,工具类是给开发人员使用的
- 工具类没有创建对象的需求,建议将工具类的构造器进行私有
static的注意事项
- 类方法中可以直接访问类的成员,不可用直接访问实例成员(实例方法中的成员,也就是没有加static的话,类方法无法直接访问该实例方法中的成员,要用对象访问)
- 实例方法中既可以直接访问类成员,也可以直接访问实例成员
- 实例方法中可以出现this关键字,类方法中不可以出现this关键字
static的应用知识:代码块
静态代码块
格式:static{}
特点:类加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次
作用:完成类的初始化,例如,对类变量的初始赋值
实例代码块
格式:{}
特点:每次创建对象时,执行实例代码块,并在构造器前执行
作用:和构造器一样,都是用来完成对象的初始化,例如,对实例变量进行初始化赋值
public class Student{
static int number = 80;
//静态代码块
static{
System.out.printIn("静态代码块执行了")
}
}
static的应用知识:单例设计模式
设计模式:
一个问题有多种解法,其中有一种解法是最优的,这个最优解法被人总结出来,称之为设计模式
关于设计模式,学什么:
1、解决什么问题2、怎么写
单例设计模式
- 确保一个类只有一个对象
写法:
1、类的构造器私有2、定义一个类变量记住类的一个对象
3、定义一个类方法,返回对象
//单例类A
public class A{
2、定义一个类变量记住类的一个对象
private static A a = new A();
1、私有类的构造器
private A(){
}
3、定义一个类方法返回类的对象
public static A getObject(){
return a;
}
}
单例模式的应用场景和应用
饿汉式单例:在获取类的对象时,对象已经创建好了
懒汉式单例设计模式:(拿对象时,才开始创建对象):
写法:1、把类的构造器私有
2、定义一个类变量用于储存对象
3、提供一个类方法,确定返回的是同一个对象
public class B{
//2、定义一个类变量,用于存储这类的一个对象
private static B b;
//1、把类的构造器私有
private B(){
}
//3、定义一个类方法,这个方法保证第一次调用时才创建一个对象,后面调用时都会用这同一个对象返回
public static B getInstance(){
if(b == null){
b = new B();
}
return b;
}
}