先简单的说一下,类中用 static 关键字修饰的成员都是静态成员,是这个类通用的特征( 属性 )行为( 方法 );而不用 static 修饰的成员即为非静态成员,或者叫实例成员,对于用同一个类实例出的每一个对象,都有他自己的一套实例成员,贵自己的实例对象独有。
使用方法如下:
静态成员一般通过类名调用,也可以通过对象来调用,或者在所在类的其他方法( 可以是静态,也可以是非静态 )里直接使用(不管如何调用,只要记住一点:同类所有对象共用同一个静态成员)。但是在静态方法里,只能直接访问静态成员,不能直接访问非静态成员。(要想在静态方法里访问非静态成员,可以实例该类的一个对象,然后在通过对象调用非静态成员。)
非静态成员只能通过实例调用,别无他法。
只要记住一点:把 static 成员和非静态成员彻底分隔开,他们各自作用不同,用法不同,之间没有任何联系。
class
Test
{
static int b = 999;
int a = 4;
void m1(){
Test obj1 = new Test();
System.out.print("m1: "+a+" "+obj1.a);
a=1;
System.out.print(" "+a+" "+obj1.a);
obj1.a=2;
System.out.println(" "+a+" "+obj1.a);
obj1.m2();
System.out.println("m1: "+a+" "+obj1.a); // Tag1:可以很好的观察m2方法中的a究竟代表什么
}
void m2(){
Test obj2 = new Test();
System.out.print("m2: "+a+" "+obj2.a);
a=8;
System.out.print(" "+a+" "+obj2.a);
obj2.a=9;
System.out.println(" "+a+" "+obj2.a);
System.out.print(b); //在非静态方法中直接使用静态成员(相当于通过对象调用)
m3(); //在非静态方法中直接使用静态成员(相当于通过对象调用)
// obj2.m1(); // Tag2:当本语句被释放,同时Tag1被注释,会有不错的死循环效果
}
static void m3(){
System.out.println(b);
b=666; //静态方法只能调用其他静态成员(也包括方法)
// a=666; //静态方法不能调用非静态属性(也不能调用静态方法)
}
public static void main(String [ ] args){
System.out.println(" : a obj a obj a obj");
Test obj = new Test();
// obj.a=5; // Tag3:帮助你充分理解:类中的属性是对象的属性
obj.m1();
System.out.println("main: "+obj.a);
Test.m3(); //通过类名调用静态方法
m3(); //在静态方法内,可以直接调用本类的其他静态成员
obj.m3(); //通过对象调用静态方法
System.out.println(Test.b);
System.out.println(b);
System.out.println(obj.b); //通过对象调用静态属性
// System.out.println(a); //main也是静态方法,当然不能直接访问非静态属性
}
}
static int b = 999;
int a = 4;
void m1(){
Test obj1 = new Test();
System.out.print("m1: "+a+" "+obj1.a);
a=1;
System.out.print(" "+a+" "+obj1.a);
obj1.a=2;
System.out.println(" "+a+" "+obj1.a);
obj1.m2();
System.out.println("m1: "+a+" "+obj1.a); // Tag1:可以很好的观察m2方法中的a究竟代表什么
}
void m2(){
Test obj2 = new Test();
System.out.print("m2: "+a+" "+obj2.a);
a=8;
System.out.print(" "+a+" "+obj2.a);
obj2.a=9;
System.out.println(" "+a+" "+obj2.a);
System.out.print(b); //在非静态方法中直接使用静态成员(相当于通过对象调用)
m3(); //在非静态方法中直接使用静态成员(相当于通过对象调用)
// obj2.m1(); // Tag2:当本语句被释放,同时Tag1被注释,会有不错的死循环效果
}
static void m3(){
System.out.println(b);
b=666; //静态方法只能调用其他静态成员(也包括方法)
// a=666; //静态方法不能调用非静态属性(也不能调用静态方法)
}
public static void main(String [ ] args){
System.out.println(" : a obj a obj a obj");
Test obj = new Test();
// obj.a=5; // Tag3:帮助你充分理解:类中的属性是对象的属性
obj.m1();
System.out.println("main: "+obj.a);
Test.m3(); //通过类名调用静态方法
m3(); //在静态方法内,可以直接调用本类的其他静态成员
obj.m3(); //通过对象调用静态方法
System.out.println(Test.b);
System.out.println(b);
System.out.println(obj.b); //通过对象调用静态属性
// System.out.println(a); //main也是静态方法,当然不能直接访问非静态属性
}
}
(个人见解,仅供参考。欢迎提出不同见解,共同讨论!)