文章内容发布于 6 天前;最后修改于 6 日前。其中的信息可能发生变化或产生更改,敬请留意。
static 静态
static静态,是存在类中的概念的,表示静态。可以修饰成员方法、也可以修饰成员变量。
被static修饰的成员变量,叫做静态变量。
被static修饰的成员方法,叫做静态方法。
静态变量
被static修饰的成员变量,叫做静态变量。
静态变量的特点
- 静态变量被该类的全部对象共享
- 不属于对象,属于类
- 随着类的加载而加载,优先于对象存在
静态变量的调用方法
- 通过类名调用【推荐】:
<类名>.<静态变量名> - 通过具体的对象的对象名调用:
<对象名>.<静态变量名>
代码如下
public class MyStaticClass {
public static void main(String[] args) {
myCatsFriend cat1 = new myCatsFriend("linCat", "Ginger");
myCatsFriend cat2 = new myCatsFriend("bingCat", "Calico");
cat1.showCat();
cat2.showCat();
myCatsFriend.catMaster = "SakuraNyako"; // 通过类名访问
cat1.showCat();
cat2.showCat();
cat1.catMaster = "SakuraLeffay"; // 通过具体的对象名访问
cat1.showCat();
cat2.showCat();
}
}
class myCatsFriend {
public String catName;
public String catTpye;
public static String catMaster;
public myCatsFriend(String catName, String catTpye) {
this.catName = catName;
this.catTpye = catTpye;
}
public void showCat() {
System.out.println(catName + "\t" + catTpye + "\t" + catMaster);
}
}
运行结果

在上面的例子中,myCatsFriend.catMaster = "SakuraNyako";是通过类名访问,cat1.catMaster = "SakuraLeffay";是通过变量名访问。因为是静态对象,所以无论什么方法访问对象,都是访问的同一个对象。

静态变量是随着类的加载而加载的,优先于对象出现。也就是在加载类的时候,静态区(元空间)就创建了静态变量的内存空间,而对象所属的内存的创建,是等到使用new关键字创建对象后才开辟对应在堆内存的内存空间。事实上,所有被**static**关键字修饰的,无论是静态变量还是静态方法,均是类加载后立刻在堆内存的静态区开辟对应内存空间。
关于内存的空间需要注明的是:JDK 8之前:静态变量存储在方法区(PermGen);JDK 8及以后:静态变量存储在堆内存的元空间(Metaspace)
被static关键字修饰的静态内容,无论是静态变量还是静态方法,在内存中只存储一份。
静态方法
被static修饰的成员方法,叫做静态方法。
静态方法的特点
- 多用于测试类和工具类中
- 在Javabean类中极其少用
静态方法的调用方法
- 在静态方法所在的类中,直接调用。
- 通过类名调用【推荐】:
<类名>.<静态方法名> - 通过具体的对象的对象名调用:
<对象名>.<静态方法名>
说明
各种类的说明
- Javabean类:主要用于封装数据,需要符合Javabean规范。
- 测试类:用于检查其他类是否书写正确,带有
main方法的类,是程序的入口。 - 工具类:包含通用的、与具体业务无关的功能,方法都是静态方法(
static);构造方法私有化(即构造方法使用private修饰),防止实例化。
静态方法的说明
虽然静态方法可以存在在各种类中,但是绝大部分场景下都是存在在工具类中的。工具类由于是构造方法私有化,所以如果静态方法存在于工具类中,是无法通过具体的对象名来调用的。
static的注意事项
- 静态方法只可以访问静态变量和静态方法;
- 非静态方法可以访问静态变量、或者静态方法,同时非静态方法可以亦可以访问非静态成员变量、或者非静态的成员方法;
- 静态方法中,没有
this关键字;
简单来说,就是静态方法只能访问静态,非静态方法可以访问所有,静态方法没有**this**关键字。