static在Java中可以修饰类,即静态内部类。静态内部类不需要依赖外部类实例而存在,可以直接通过外部类名来访问。加载时机通常在相关的外部类被加载时,但具体触发其加载的操作可能因不同的运行环境和代码执行路径而有所差异。
package oneHundredDayPlan.twoDay;
public class One {
private static int data = 10;
// 静态内部类
static class Two {
public void method() {
// 可以直接访问外部类的静态成员
System.out.println(data);
}
}
public static void main(String[] args) {
One.Two a = new One.Two();
a.method();
}
}
可以修饰属性,静态属性属于类所有,而非类的实例。所有实例共享同一个静态属性的值。在类加载时初始化,存储在方法区。
package oneHundredDayPlan.twoDay;
public class One {
//静态变量(类变量、静态属性)
private static int number;//静态变量是在类加载的时候初始化的,且初始化为该类型的默认初值
private static int sum = 10;//也可以显式初始化
//静态常量,需要在定义的同时初始化,否则编译报错
public static final double PI = 3.14;
public static void main(String[] args) {
//静态变量的调用方式有两种
//1.类名.静态属性名(推荐使用)
System.out.println(One.number);
//2.对象名.静态属性名
One s = new One();
System.out.println(s.number);
//静态常量的调用形式也为两种
//类名.静态常量名(推荐使用)
System.out.println(One.PI);
//对象名.静态常量名
System.out.println(s.PI);
}
}
不可以修饰局部变量,在普通的局部作用域内,static通常不能修饰局部变量
可以修饰方法 ,静态方法也是属于类的,而非实例。可以直接通过类名调用,不需要创建对象。静态方法只能访问静态成员(静态属性和其他静态方法),不能直接访问实例成员。在类加载时就可以被调用。静态方法中不能直接调用非静态属性和非静态方法,可以直接调用静态属性和静态方法。非静态方法中可以直接调用静态属性、静态方法、非静态属性和非静态方法。
package oneHundredDayPlan.twoDay;
public class One {
//静态方法就是由static修饰的方法
int age;
static double score;
//非静态方法中可以直接调用静态属性、静态方法、非静态属性和非静态方法。
public void doSomething(){
System.out.println(age);
System.out.println(score);
method1();
method2();
}
//静态方法中不能直接调用非静态属性和非静态方法,可以直接调用静态属性和静态方法
public static void saySomething(){
// System.out.println(age);//代码报错
System.out.println(score);
// method1();代码报错
method2();
//非要在静态方法中调用非静态成员需要创建对象进行间接调用
One s = new One();
System.out.println(s.age);
s.method1();
}
public void method1(){}
public static void method2(){}
public static void main(String[] args) {
//静态方法的调用形式为
//1.类名.静态方法名(推荐使用)
One.method2();
//2.对象名.静态方法名
One s = new One();
s.method2();
}
}
可以修饰代码块,static
可以修饰代码块,即静态代码块。静态代码块在类加载时执行,且只执行一次,通常用于初始化静态成员或者进行一些一次性的初始化操作,比如加载配置文件、初始化数据库连接池等。执行顺序在构造方法等其他非静态初始化操作之前。
package oneHundredDayPlan.twoDay;
public class One {
//构造方法是给对象进行初始化工作的,
//静态块是给类进行初始化的
static int a;
int age;
static final double PI;//有静态块可以分着写,没有的话必须写值
//静态块中不能直接调用非静态属性和非静态方法,可以直接调用静态属性和静态方法
static{
PI = 3.14;
System.out.println(a);
// System.out.println(age);
System.out.println("静态块中的代码");
method1();
}
//因为全是static修饰的代码,那么执行顺序就会从上到下按照顺序执行
//static int a;
public static void method1(){}
public void method2(){};
public static void main(String[] args) {
System.out.println("main方法的代码");
}
}