java 用 static修饰属性,以及线程

1. What will happen when you attempt to compile and run the following code?


public class Tux extends Thread {
static String sName = "vandeleur";
public static void main(String argv[]) {
Tux t = newTux();
t.piggy(sName);
System.out.println(sName);                           //静态属性的调用,不改变原来的值,Tux.sName="abc"可以改变静态值。 而实例属性,值会跟着改变。
}
public void piggy(String sName){
 sName = sName + " wiggy";                   //不会改变静态属性值
start();
}
public void run(){
for(int i=0;i<4; i++) {
sName = sName + "" + i;
}
}
}
A) Compile time error
B) Compilation and output of "vandeleur wiggy"
C) Compilation and output of "vandeleur wiggy 0 12 3"
D) Compilation and probably output of "vandelur" but possible output of "vandeleur 0 1 2

 

D是正确的。注意线程的使用,是无序执行的,所以sName也会跟着变

 

静态方法
通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法。

静态变量
静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载时,只分配一

块存储空间,所有此类的对象都可以操控此块存储空间,当然对于final则另当别论了。

 

class Value{static int c=0;static void inc(){c++;}}
class Count{public static void prt(String s){System.out.println(s);}
public static void main(String[] args){
Value v1,v2;v1=new Value();
v2=new Value();
prt("v1.c="+v1.c+" v2.c="+v2.c);
v1.inc();
prt("v1.c="+v1.c+" v2.c="+v2.c); }} 

//结果如下:
v1.c=0 v2.c=0
v1.c=1 v2.c=1

 

 

class Value{static int c=0;Value(){c=15;}
Value(int i){c=i;}static void inc(){c++;}
}
class Count{public static void prt(String s){System.out.println(s);}
Value v=new Value(10);
static Value v1,v2;

static{prt("v1.c="+v1.c+" v2.c="+v2.c);                            //static 程序块
v1=new Value(27);prt("v1.c="+v1.c+" v2.c="+v2.c);
v2=new Value(15);prt("v1.c="+v1.c+" v2.c="+v2.c);}

public static void main(String[] args){

Count ct=new Count();

prt("ct.c="+ct.v.c);

prt("v1.c="+v1.c+"

v2.c="+v2.c);

v1.inc();

prt("v1.c="+v1.c+" v2.c="+v2.c);

prt("ct.c="+ct.v.c);}}

 

结果如下:

v1.c=0 v2.c=0
v1.c=27 v2.c=27
v1.c=15 v2.c=15
ct.c=10
v1.c=10 v2.c=10
v1.c=11 v2.c=11
ct.c=11

 

static定义的变量会优先于任何其它非static变量,不论其出现的顺序如何。正如在程序中

所表现的,虽然v出现在v1和v2的前面,但是结果却是v1和v2的初始化在v的前面。在

static{后面跟着一段代码,这是用来进行显式的静态变量初始化,这段代码只会初始化一

次,且在类被第一次装载时。

 

 

 

 

 

你可能感兴趣的:(java,thread,C++,c,C#)