Static的作用
在Java中,static关键字主要用于创建静态变量(不能修饰局部变量)、静态方法、静态初始化块、静态内部类以及静态导入。其实java的static关键字相对于objective-c较好理解,使用static关键字的主要目的是为了实现共享,可以简单理解为被static修饰的内容属于类,不属于类对象,即在不创建对象的情况下直接访问这些成员。下面详细解释Java中static关键字的几种主要用法:
1、静态变量
特点
- 不能修饰局部变量,局部变量是在方法、构造器或初始化块中声明的变量,由于局部变量的生命周期与方法调用或代码块执行的开始和结束相绑定,因此它们并不具备static所代表的“全局”或“类级别”的特性
- 属于类本身,通过类访问
- 在内存中只有一份拷贝,存储在方法区的静态区域
public class testjhf {
static int myvar = 10;//静态变量
public void display(){
System.out.println(myvar); // 可以在任何对象或静态上下文中访问
}
}
class secondClass{
public static void main(String[] args) {
testjhf.myvar = 20; // 直接通过类名访问静态变量
testjhf obj = new testjhf();
obj.display(); // 输出20
}
}
2、静态方法
特点
- 属于类本身,通过类访问
- 静态方法中不能访问非静态变量和非静态方法,因为它们属于对象,而在没有创建对象时,这些成员并不存在。
public class MyClass {
static void myMethod() {
System.out.println("Hello, World!");
}
}
public class Main {
public static void main(String[] args) {
MyClass.myMethod(); // 通过类直接调用静态方法
}
}
3、静态代码块
特点
- 静态初始化块用于初始化类中的静态成员。当类被加载到JVM时,静态初始化块将被执行一次。
- 静态代码块优先于构造函数执行
public class MyClass {
static int myVar;
static {
myVar = 10;
System.out.println("Static initialization block");
}
}
public class Main {
public static void main(String[] args) {
System.out.println(MyClass.myVar); // 输出10,并且只在第一次加载MyClass时输出初始化信息
}
}
4、静态内部类
特点
- 静态内部类是定义在一个外部类中的类,但是它与外部类没有绑定关系
- 静态内部类可以像一个普通的类那样被实例化,而无需创建外部类的实例
public class OuterClass {
static class StaticInnerClass {
void display() {
System.out.println("Static Inner Class");
}
}
}
public class Main {
public static void main(String[] args) {
OuterClass.StaticInnerClass innerObj = new OuterClass.StaticInnerClass();
innerObj.display(); // 输出"Static Inner Class"
}
}
5、静态导入
特点
- static关键字也可以用于导入特定的静态成员或者方法,这样就可以在代码中直接使用这些成员的名字,而无需前缀。 比如:假设我们经常需要使用Arrays.asList()方法来创建列表,我们可以使用静态导入避免每次都要写Arrays.asList()
import static java.util.Arrays.asList; // 静态导入
public class StaticImportExample {
public static void main(String[] args) {
List<String> list = asList("Apple", "Banana", "Cherry");
System.out.println(list);
}
}
java
在上面的例子中,我们导入了java.util.Arrays.asList()方法。这样一来,在主方法中,我们可以直接使用asList方法,而无需写出完整的类名。
静态字段同样可以使用静态导入。例如,如果经常使用System.out来打印输出,可以将其静态导入
```java
import static java.lang.System.out; // 静态导入
public class StaticImportExample {
public static void main(String[] args) {
out.println("Hello, World!"); // 直接使用out代替System.out
}
}