在Java中,static 是一个关键字,用于修饰类的成员(包括变量、方法和内部类)。它有几个主要的用途和含义:
静态变量(Static Variables):
也称为类变量。它们不属于任何一个对象实例,而是属于类本身。
静态变量在内存中只有一个副本,无论创建多少个对象实例,它们都共享这个静态变量的副本。
通常,静态变量用于跟踪与类相关的某些统计信息。
public class Counter {
public static int count = 0;
public Counter() {
count++;
}
}
静态方法(Static Methods):
静态方法属于类,而不是类的任何特定实例。
静态方法可以直接通过类名调用,而无需创建类的实例。
静态方法只能访问静态数据成员(即静态变量和其他静态方法),不能访问非静态数据成员。
public class MathUtils {
public static int add(int a, int b) {
return a + b;
}
}
静态代码块(Static Block):
静态代码块是类的一部分,它在类被加载时执行,而且只执行一次。
静态代码块通常用于初始化静态变量。
public class Example {
static {
System.out.println("Class is being loaded.");
}
}
静态内部类(Static Nested Classes):
静态内部类是一个定义在另一个类内部的类,但它不需要外部类的实例就可以被实例化。
静态内部类可以访问外部类的静态成员,但不能访问非静态成员。
public class Outer {
public static class Inner {
// ...
}
}
静态导入(Static Imports):
从Java 5开始,static 关键字还可以用于导入静态成员(如静态方法和静态变量)。
这允许你在代码中直接使用静态成员,而无需使用类名作为前缀。
import static java.lang.Math.PI;
import static java.lang.Math.sin;
public class Test {
public static void main(String[] args) {
double value = sin(PI);
System.out.println(value);
}
}
总的来说,static 关键字在Java中提供了多种用途,允许开发人员更灵活地组织和控制代码。
应用举例:
public class student {
//static静态属性
private static int age;//static静态的变量
private double score;//静态的变量
public void run() {
}
public static void go() {
}
public static void main(String[] args) {
student s1= new student();
System.out.println(s1.age);//通过对象s1去调用age
System.out.println(s1.score);//通过对象s1去调用score
System.out.println(student.age);//age为static的变量,所以student class调的动
//System.out.println(student.score);//score不是static的变量,所以一写直接报错,student class调不动
s1.run();//run没法直接调用,run();这样无法调用,需要寄托在对象上
go();//因为go是static的 而且目前就在student里面,所以直接调
student.go();//这句其实等于上面一句
}
}
输出结果
0
0.0
0
小tips:以前讲过的static伴随着class在程序最开始运行时候就加载了,只加载一次。
public class human {
{
//匿名代码块
System.out.println("★ 匿名代码块");
}
static {
//静态代码块
System.out.println("☆ 静态代码块");
}
public human(){
System.out.println(" ✬ 这里是构造方法");
}
public static void main(String[] args) {
human x= new human();
System.out.println("====分隔线=====");
human y= new human();
}
}
运行结果
☆ 静态代码块
★ 匿名代码块
✬ 这里是构造方法
====分隔线=====
★ 匿名代码块
✬ 这里是构造方法
import static java.lang.Math.random;
import static java.lang.Math.PI;
//这叫做静态导入包
//思考:为什么写成import java.lang.Math.random;会报错
//注意这里不加static是无法导入成功的
//通过final修饰的class不能再有子类;ctrl+鼠标双击Math有惊喜
public class non_s {
public static void main(String[] args) {
System.out.println(Math.random());//生成随机数标准写法
System.out.println(random());//生成随机数简易写法,配合import使用
System.out.println(PI);
}
}
结果运行:
//会产生类似下面的随机数
0.6666269235416441
0.18718877180311122
3.141592653589793