Static静态关键词
static修饰的成员变量在系统中只保存一份,且可以被共享、修改。
访问方式:
- 类名.静态成员变量名【推荐】
- 对象名.静态成员变量名
无static修饰的:是属于对象的(即实例成员变量),必须使用对象名进行访问。
成员方法分为:
1.静态成员方法(建议用类名访问,也可使用对象名使用)
2.实例成员方法(无static修饰,归属于对象,需要通过对象名访问)
- 同一个类中访问静态成可以省略类名。
static使用场景:
- 若该方法是以完成共同行为为目的的,申明为静态方法。
- 若方法中需要访问实例成员,表示对象自己的行为的,用实例成员方法。
static访问注意事项
以下是我笔记的一些内容
static应用知识:工具类
什么是工具类?
工具类顾名思义就是工具箱一样的存在,类中都是一些静态成员方法,每个方法都是以完成一个共同功能为目的,这个类供工作人员访问。
工具类的好处:
- 调用方便,随用随调
- 提高代码利用率(一次编写,处处可用)
工具类定义的其他要求:
由于工具类里面都是静态的成员方法,可直接用类名访问,因此不用创建新对象,可直接将工具类的构造器进行私有(这样使代码显得很专业)。
static应用知识:代码块
类的五大成分:成员变量、成员方法、构造器、代码块、内部类。
代码块的位置:位于类中,方法外;在java中,由{}围起来的代码叫做代码块。
代码块的分类:
- 静态代码块
格式:static{}
特点:需要static修饰,随类加载而加载,自动触发只执行一次
作用:在类加载时,对一些数据进行数据初始化处理,方便后续使用。
public class code{
public static void main(String[] args) {
A a = new A();
}
}
class A{
//静态代码块
static {
System.out.println("静态代码块正在被执行");
}
}
//执行结果:静态代码块正在被执行
创建一个B类作为A的父类
public class code{
public static void main(String[] args) {
A a = new A();
}
}
class A extend B{
//静态代码块
static {
System.out.println("静态代码块A正在被执行");
}
}
class B{
//静态代码块
static {
System.out.println("静态代码块B正在被执行");
}
}
//输出结果:静态代码块B正在被执行
静态代码块A正在被执行
说明代码块可以被继承,子类被调用时,先执行父类的静态代码块,在执行子类的静态代码块。
再看一段代码:
public class code{
public static void main(String[] args) {
System.out.println(A.n)
}
}
class A{
public Int n=100;
//静态代码块
static {
System.out.println("静态代码块正在被执行");
}
}
//执行结果:静态代码块正在被执行
100
说明静态代码块总是最先加载。
- 构造代码块
格式:{}
特点:创建的构造器执行时执行一次并且在构造器中执行。
使用场景:初始化实例资源
static应用知识:单例模式
什么是设计模式?
在开发时,一个问题可能有很多解法,问题的最优解就是设计模式。
单例模式
这种模式只有一个实例对象,可以节省内存空间。
饿汉单例:
是什么?是在获取对象之前就已经准备好了一个对象,这个对象只能有一个所以定义成静态成员变量。
特点:1.构造器私有化。
2.创建static修饰的对象。
public class Person {
private static Person person = new Person();//建一个静态变量储存的对象
private Person(){}//构造器私有化
public static Person getInstance(){
return person;
}
}
懒汉单例:
是什么?顾名思义就是真正需要使用对象时才去创建对象。
设计步骤:
1.定义一个类,将构造器私有。
2.定义一个对象,用静态变量储存。
3.提供一个返回单例对象的方法。
public class User {
//懒汉式单例,只有在调用getInstance时才会实例化一个单例对象
public static User user; //静态变量储存的对象
private User(){
} //构造器私有
public static User getInstance(){
if(user==null){
user = new User(); 判断对象是否存在
}
return user;
} //当真正需要时调用,并返回单例对象
}