Java中的static都能用来修饰什么?
在Java编程语言中,static关键字是非常重要的修饰符,可以用于多种不同的地方。可用来修饰变量、方法、代码块以及类。
1.静态变量
定义:静态变量属于类本身,而不是类的任何特定实例(new出来的对象)。
特点:
1.所有实例共享同一静态变量。
2.在类加载到内存时就被初始化,而不是在创建对象的时候。
3.常用于管理类的全局状态或作为常量仓库(例如public static final修饰的常量)。
2 静态方法:
定义:静态方法同样属于类,而非类的实例。
特点:
1.可以在不创建类的实例的情况下调用。
2.不能访问类的实例变量或实例方法,它们只能访问其他的静态成员。
3.常用于工具类的方法,例如Math.sqrt()或Collections.sort()。
3 静态代码块:
定义:用于初始化类的静态变量。
特点:
1.当类被Java虚拟机加载并初始化时执行。
2.通常用于执行静态变量的复杂初始化。
4.静态内部类:
定义:在一个类的内部定义的静态类。
特点:
1.可以不依赖于外部类的实例而独立存在。
2.可以访问外部类的所有静态成员,但不能直接访问外部类的实例成员。
3.常用于当内部类的行为不应依赖于外部类的实例时。
这里有两段代码,看看有什么不同
public class OuterClass {
//静态内部类
public static class inClass{
private int value;
public inClass(int value) {
this.value =value;
}
public void display() {
System.out.println("Value" +value);
}
}
}
class Test{
public static void main(String[] args) {
OuterClass.inClass t1 = new OuterClass.inClass(5);
t1.display();
}
}
public class OuterClass {
//静态内部类
public static class inClass{
private int value;
public inClass(int value) {
this.value =value;
}
public void display() {
System.out.println("Value" +value);
}
}
public static void main(String[] args) {
OuterClass.inClass t1 = new inClass(5);
t1.display();
}
}
思考
我在第二段代码创建t1对象的时候没有选择new OuterClass.inClass(5),我很好奇因为按照规范应该会报错,于是我去查了查。
其实背后是 Java 编译器“容忍性”的一个体现。
乍一看像是错误的,因为在 new inClass(5)
这里省略了前缀 OuterClass.
,但编译器居然没有报错。
为什么没报错?
因为你写的是在 OuterClass
的代码内部,也就是说你在 main
方法中就处在 OuterClass
的作用域里。Java 编译器允许你在这个作用域中省略 OuterClass.
这个前缀。举个类似的例子:
public class A {
public static class B {
public void hello() {
System.out.println("Hi");
}
}
public static void main(String[] args) {
B b = new B(); // 不写 A.B 也没问题
b.hello();
}
}
}
这个代码能正常运行,因为在 A 的作用域里,B 是可见的。
那如果你在类外部使用呢?
如果你尝试在另一个类中写:
public class Test {
public static void main(String[] args) {
inClass t = new inClass(5); // 这就不行了!
}
}
这时候就一定要写成:
OuterClass.inClass t = new OuterClass.inClass(5);
否则编译器就会报错:cannot find symbol
。
有没有突然觉得 Java 编译器其实还是挺“贴心”的 😄?