title: static
index_img: https://picss.sunbangyan.cn/2023/07/30/stdtw2.jpg
tags:
- Java SE
categories:
- Java SE
hide: false
excerpt: static遍历、方法、访问
在Java等面向对象的编程语言中,static
被用作一个关键字来声明静态的变量和方法。其主要作用是创建只需要在类级别而不是实例级别初始化和使用的字段和方法。这意味着static
修饰的变量或方法是归属于类的,而不属于对象。
内存分析
静态变量(static variable):
静态变量被存储在Java的方法区内(有些地方也称为元数据区、PermGen Space永久代等)。当一个类被Java的类加载器加载到内存中时,Java会为这个类的所有静态变量在方法区内分配内存。所有的静态变量都会在类加载的时候初始化,并且只会被加载一次,也就是说静态变量在内存中只有一份,它们的值会被类的所有对象共享。
静态方法(static method):
静态方法和静态变量一样,也是属于类的,它们在类加载的时候会在方法区内创建。静态方法可以直接通过类名调用,无需创建对象。由于静态方法不依赖任何对象就可以进行访问,因此静态方法不能访问类中的实例变量和实例方法(非静态变量和非静态方法),也不能使用this
关键字。
总的来说,static
关键字定义的变量或方法,都是存在于Java的方法区内,被所有对象所共享。
静态变量
一个被声明为static
的变量就成为了静态变量。它只在类级别创建和使用,只有一份存储空间,不管创建多少个对象,静态变量只有一个,所有实例共享。静态变量常常被声明为常量,常量一般用大写字母表示,例如public static final double PI = 3.1415927;
。静态变量也常常作为需要被所有实例共享的属性。
我们可以设置一个static变量一次,然后其它类对象就会共享,不需要修改
public class Demo {
public static int count = 0; // 静态变量,所有实例共享
public Demo (){
count++;
}
public static void main(String[] args) {
Demo demo1 = new Demo();
Demo demo2 = new Demo();
// 输出结果为2,说明静态变量是所有实例共享的
System.out.println(Demo.count);
}
}
静态方法
静态方法也称为类方法,它没有this
关键字,可以直接通过类名调用而无需实例化对象,例如Math.abs(-10)
。静态方法可以访问静态变量和改变它的值。它们最常见的应用是作为工具方法或辅助方法。
public class MathUtil {
public static int abs(int num) {
return num>=0 ? num : -num;
}
}
然后可以直接通过类名调用静态方法:MathUtil.abs(-10)
注意,静态方法不能访问类的非静态变量。
工具类
工具类通常会包含一些静态方法,这些方法通常是没有关联状态的,它们对于输入的值执行一些有用的操作,并返回结果。如java.lang.Math
,java.util.Arrays
,java.util.Collections
等。
public class StringUtil {
public static boolean isEmpty(String str) {
return str==null || str.length()==0;
}
}
注意事项
- 静态变量和静态方法可以通过对象名调用,也可以直接通过类名调用(推荐)。
- 静态方法只能访问和修改静态变量,不能访问和修改实例变量。
- 静态方法不能使用
this
和super
关键字,因为它们不存在在任何一个实例对象中。 - 静态方法不能被子类覆盖,但可以被子类继承。
static
块用于初始化静态变量,它在类加载时执行一次。static
不能用来修饰构造器,因为构造器是创建对象时调用的,而static
不需要对象就可以访问。
使用场景
- 当需要全局变量或者常量时,可以使用静态变量。
- 当需要在没有创建对象的情况下进行方法调用时,可以使用静态方法。
- 使用单例模式时,经常使用到静态变量保存唯一的实例。
- 使用工具类时,包含许多静态方法,可以直接使用类名调用,简单方便。
- 如果一个方法仅仅使用到参数和静态变量,那么这个方法就有可能被设定为静态方法。