[问题] 建构子与static 变量

楼主: birdy1147 (Allen)   2016-07-13 11:04:27
不好意思,想问个比较基础的问题,我知道题意是要考static与 non-static,但我看了
很久都想不通,如下:
class Ans{
int ns;
static int s;
Ans(int ns){
if(s<ns){
s=ns;
this.ns=ns;
}
}
void print( ){
system.out.println(“ns= ”+ns+“ s= ”+s);
}
}
public class Test{
public static void main(String[ ] args){
Ans a = new Ans(50);
Ans b = new Ans(125);
Ans c = new Ans(100);
a.print( );
b.print( );
c.print( );
}
}
我以为结果会是 ns=50 s=50
ns=125 s=125
ns=100 s=100
但结果是 ns=50 s=125
ns=125 s=125
ns=0 s=125
我知道全域变量int在没有设定的情况下,系统会默认为0
所以在new Ans(50);时,经过if判断式,会被两个变量设为50
所以我以为答案是我想的那样,
但从正确答案看来,static int s;会留着之前的50,而int ns;却会重新归0
想请问这是为什么呢?我以为重新new过以后,指派给新的物件,应该会是不相关的两个
物件?
作者: mars90226 (火星人)   2016-07-13 11:27:00
你这贴上来的code有很多小错误,然后我直接结果是ns= 50 s= 125; ns= 125 s= 125; ns= 125 s= 125static变量就是属于class的,所以同个class的instance用到的static变量是同一个,所以自然不会归0贴错,最后一行是ns= 0 s= 125
作者: ssccg (23)   2016-07-13 11:32:00
你知道题意是要考static和non-static,可是你看起来好像完全不懂static,不先重新搞清楚吗static就是属于class不属于instance,new几个instance都跟static字段没有关系另外严格说起来java没有全域变量(global variable),只有class variable(static)和instance variable(non-static)
作者: kniver999 (小囧)   2016-07-13 20:47:00
因为把c new出来的时候,传进建构式的100并没有比当前的s(125)还大,所以不会进到if里面去执行,c的ns就保留初值0了
作者: kyleJ (资工人)   2016-07-13 23:05:00
其实你的问题上面真的都回答完了 只是你眼睛闭上说那是假的没去看 static不是C那种全域变量的概念 而物件new多少个出来 static的内容都会共用
作者: ssccg (23)   2016-07-14 00:25:00
从你问的问题看起来你就是没懂啊..一开始 Ans.s 等于 0Ans a = Ans(50) // 0<50,所以结果Ans.s=50,a.ns=50Ans b = Ans(125) // 50<125,所以结果Ans.s=125,b.ns=125Ans c = Ans(100) //125>100,所以结果Ans.s不变,c.ns为0所谓不管new几个变量都跟static字段没关,所以static字段一直是同一个,不管在哪个new Ans()里面呼叫都是同一个"为什么之后new的变量还要受到影响",Ans()里面就拿Ans.s来用,要怎么不受影响? 程式写怎样不就怎样最后print时Ans.s也都是同一个,所以都印出s=125如果你真的还看不懂,就把程式里用到s的地方都改成Ans.s再看一次,跟this.ns就差在一个属于instance一个属于class
作者: nmbalance   2016-07-15 16:24:00
我刚学Java一个月都懂前面推文大大辛苦仔细的解说,请发文者先认真搞清楚好吗,不要自己不懂就一直觉得是别人解释不清楚
作者: ssccg (23)   2016-07-15 18:34:00
一个class只会被load一次,不管从哪个class呼叫都是同一个除非用自订的ClassLoader去管理class加载,不过我想这不在基础范围了,通常使用就是不会重新加载了
作者: gmoz ( This can't do that. )   2016-07-18 11:10:00
阿宣告成static就是只有一个阿,全部同class的instance共用当有多数人都用同样的方式回答你 你就要想看看是不是自己错了 不要坚持己见这个逻辑同样可套用在抓bug上 共勉之
作者: allen8952   2016-07-25 00:48:00
就我的想法来看,你创造三个物件,可是你在第三次创造的时候就已经把static设定为125了所以不管怎么样s一定是抓到125你创造新的东西会被归零的是妳没有设定static 的第三个print出来的ns会为零就是你在创造物件时,判断式就不会通过因为125<100是false ,ns就视为零以上是我个人见解,自学java一个月也是我第一个语言,觉得很好玩

Links booklink

Contact Us: admin [ a t ] ucptt.com