上海企业黄页青岛seo排名收费
在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 编译器其实还是挺“贴心”的 😄?