JAVA基础知识(2)--关键字static的使用
在Java类中声明属性、方法和内部类时,可使用关键字static作为修饰符,static标记的属性和方法可以由整个类进行共享,因此static修饰的属性称为类成员或者称为类方法;static修饰的方法称为类方法或者静态方法;
static修饰的语句块在其所属的类中被载入JVM时被执行一次,一般用于一次性的初始化的工作;而非static语句块是每创建一个对象就执行一次,其运行时机实在对象分配空间及实例默认和显示初始化之后和执行构造方法体中语句之前;
public class TestStatic{ //成员变量,在每个对象中各自有一份; private int i=23; //类变量,全局中只有一份; private static int j=32; public static void method1(){ //i=200;错误!静态方法中不能直接调用变量 new TestStatic().i=90; j=34; int k=2; } public static void main(String[] args){ TestStatic ts = new TestStatic(); System.out.println("ts.i="+ts.i); System.out.println("j="+j); System.out.println("ts.j="+ts.j); System.out.println("TestStatic.j="+TestStatic.j); System.out.println("------------------"); TestStatic ts1 = new TestStatic(); TestStatic ts2 = new TestStatic(); ts1.i=100; ts2.j=200; System.out.println("j="+j); System.out.println("ts.j="+ts.j); System.out.println("ts.j="+ts1.j); System.out.println("ts2.j="+ts2.j); System.out.println("------------------"); System.out.println("ts.i="+ts.i); System.out.println("ts1.i="+ts1.i); System.out.println("ts2.i="+ts2.i); System.out.println("------------------"); method1(); System.out.println("ts.i="+ts.i); System.out.println("j="+j); Li.i=100; Li l1 = new Li(); Li l2 = new Li(); } } class Li{ static int i=20; int j=30; //每创建一个对象就执行非static初始化语句块; { j=50; System.out.println("i="+i); System.out.println("j="+j); } //最先调用static static{ System.out.println("i="+i); System.out.println("A Static!"); } }
程序结果:
ts.i=23 j=32 ts.j=32 TestStatic.j=32 ------------------ j=200 ts.j=200 ts.j=200 ts2.j=200 ------------------ ts.i=23 ts1.i=100 ts2.i=23 ------------------ ts.i=23 j=34 i=20 A Static! i=100 j=50 i=100 j=50
在Java类中声明属性、方法和内部类时,可使用关键字static作为修饰符,static标记的属性和方法可以由整个类进行共享,因此static修饰的属性称为类成员或者称为类方法;static修饰的方法称为类方法或者静态方法; static修饰的语句块在其所属的类中被载入JVM时被执行一次,一般用于一次性的初始化的工作;而非static语句块是每创建一个对象就执行一次,其运行时机实在对象分配空间及实例默认和显示初始化之后和执行构造方法体中语句之前; public class TestStatic{ //成员变量,在每个对象中各自有一份; private int i=23; //类变量,全局中只有一份; private static int j=32; public static void method1(){ //i=200;错误!静态方法中不能直接调用变量 new TestStatic().i=90; j=34; int k=2; } public static void main(String[] args){ TestStatic ts = new TestStatic(); System.out.println("ts.i="+ts.i); System.out.println("j="+j); System.out.println("ts.j="+ts.j); System.out.println("TestStatic.j="+TestStatic.j); System.out.println("------------------"); TestStatic ts1 = new TestStatic(); TestStatic ts2 = new TestStatic(); ts1.i=100; ts2.j=200; System.out.println("j="+j); System.out.println("ts.j="+ts.j); System.out.println("ts.j="+ts1.j); System.out.println("ts2.j="+ts2.j); System.out.println("------------------"); System.out.println("ts.i="+ts.i); System.out.println("ts1.i="+ts1.i); System.out.println("ts2.i="+ts2.i); System.out.println("------------------"); method1(); System.out.println("ts.i="+ts.i); System.out.println("j="+j); Li.i=100; Li l1 = new Li(); Li l2 = new Li(); } } class Li{ static int i=20; int j=30; //每创建一个对象就执行非static初始化语句块; { j=50; System.out.println("i="+i); System.out.println("j="+j); } //最先调用static static{ System.out.println("i="+i); System.out.println("A Static!"); } } 程序结果: ts.i=23 j=32 ts.j=32 TestStatic.j=32 ------------------ j=200 ts.j=200 ts.j=200 ts2.j=200 ------------------ ts.i=23 ts1.i=100 ts2.i=23 ------------------ ts.i=23 j=34 i=20 A Static! i=100 j=50 i=100 j=50