目录
前言:
在Java中,static
是一个关键字,被用来创建类的变量和方法。这些静态变量和方法属于类本身,而不是类的任何对象。这意味着,无论我们创建多少类的对象,静态变量和方法都只有一个实例。下面是对Java中static
关键字的深入分析:
1.静态变量(Static Variables):
也被称为类变量,它们在所有对象中共享相同的值。静态变量在内存中只有一份拷贝,所以一个对象对它进行的修改会影响到其他所有的对象。
例如:
public class MyClass {
public static int staticVar = 0;
}
在这个例子中,staticVar
是一个静态变量,所有的MyClass
对象都共享这个变量。
2. 静态方法(Static Methods):
也被称为类方法,它们可以直接通过类名来调用,而不需要创建类的对象。静态方法只能访问静态数据,不能访问实例数据(非静态数据)。
例如:
public class MyClass {
public static void staticMethod() {
// some code here
}
}
在这个例子中,staticMethod
是一个静态方法,我们可以直接通过MyClass.staticMethod()
来调用它,而不需要创建MyClass
的对象。
3. 静态块(Static Blocks):
静态块是在类加载时执行的代码块。它们常用于初始化静态变量。静态块在类中的位置不影响其执行,它们总是在任何方法、构造函数或块之前执行。
例如:
public class MyClass {
static {
// this code will be executed first
}
public MyClass() {
// this is the constructor
}
}
4.静态类(Static Classes):
在Java中,我们不能创建一个完全静态的类(即所有的方法都是静态的类),但是我们可以创建一个只包含静态方法和变量的类。这样的类通常被用作工具类,因为它们不需要创建对象就可以使用其中的方法。
5.静态导入(Static Imports):
从Java 5开始,我们可以使用静态导入来直接使用静态方法和变量,而不需要指定类名。例如,如果我们有一个包含静态方法printHello
的类HelloUtil
,我们可以使用静态导入来直接使用这个方法,而不需要通过类名来调用它。
例如:
import static com.example.HelloUtil.printHello;
// Now we can use printHello method directly without using class name.
public class Test {
public static void main(String[] args) {
printHello();
}
}
6.静态修饰符 :
静态变量内容运行时出现在堆内存的静态存储位置(静态区)
注:静态变量是随着类的加载而加载的,优于对象出现的(意味着静态变量在堆内存出现后,也不一定有new关键字出现创建对象)详情见黑马程序员p121
选取用Static修饰的属性 要是被其他对象共享的
总结:
- 注意事项:静态变量和方法虽然方便,但过度使用可能导致代码难以管理和理解。因为静态变量在所有的对象中共享,所以修改它的值会影响到所有的对象。这可能会导致预期之外的副作用和错误。因此,我们应该谨慎地使用静态变量和方法。
//static的注意事项
静态方法只能访问静态变量和静态方法
非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量和非静态的成员方法
静态方法中是没有this关键字的==>静态方法中,只能访问静态
非静态方法可以访问使用
静态方法中没有this关键字(普通的方法会有隐藏的this关键字,因为一般成员方法不会和成员变量重名)
- 内存管理:对于静态变量和方法,它们在程序开始运行时就被加载到内存中,直到程序结束运行时才被从内存中移除。因此,它们占用的内存空间比实例变量和方法要大。这也是我们在使用静态变量和方法时需要注意的一点。