作者birdy1147 (Allen)
看板java
标题[问题] 建构子与static 变数
时间Wed Jul 13 11:04:27 2016
不好意思,想问个比较基础的问题,我知道题意是要考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过以後,指派给新的物件,应该会是不相关的两个
物件?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.80.31.111
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1468379069.A.DD3.html
1F:推 mars90226: 你这贴上来的code有很多小错误,然後我直接结果是07/13 11:27
2F:→ mars90226: ns= 50 s= 125; ns= 125 s= 125; ns= 125 s= 12507/13 11:27
3F:→ mars90226: static变数就是属於class的,所以同个class的instance07/13 11:28
4F:→ mars90226: 用到的static变数是同一个,所以自然不会归007/13 11:28
5F:→ mars90226: 贴错,最後一行是ns= 0 s= 12507/13 11:28
这是我用手机打的,有的符号跟字母按错,更正了
6F:→ ssccg: 你知道题意是要考static和non-static,可是你看起来好像完07/13 11:32
7F:→ ssccg: 全不懂static,不先重新搞清楚吗07/13 11:34
8F:→ ssccg: static就是属於class不属於instance,new几个instance都跟07/13 11:37
9F:→ ssccg: static栏位没有关系07/13 11:39
10F:→ ssccg: 另外严格说起来java没有全域变数(global variable),只有07/13 11:42
11F:→ ssccg: class variable(static)和instance variable(non-static)07/13 11:43
你说的我都懂啊,我想问的是,在第一次new了a带入50後,接着再new b 为什麽还要跟50
比,如果new几个instance都跟static栏位没有关系,那为什麽之後new的变数还要受到影
响?
12F:→ kniver999: 因为把c new出来的时候,传进建构式的100并没有比当前07/13 20:47
13F:→ kniver999: 的s(125)还大,所以不会进到if里面去执行,c的ns就保留07/13 20:48
14F:→ kniver999: 初值0了07/13 20:48
这些流程我知道,我想问的是上面打的那样
※ 编辑: birdy1147 (111.80.31.111), 07/13/2016 21:45:06
15F:→ kyleJ: 其实你的问题上面真的都回答完了 只是你眼睛闭上说那是假07/13 23:05
16F:→ kyleJ: 的没去看 static不是C那种全域变数的概念 而物件new多少个 07/13 23:05
17F:→ kyleJ: 出来 static的内容都会共用 07/13 23:05
可能我表达的方式不够好,上面回答的没有不对,但没有厘清到我不懂的地方,而不是什
麽我闭上眼睛说那是假的....
18F:→ ssccg: 从你问的问题看起来你就是没懂啊.. 07/14 00:25
19F:→ ssccg: 一开始 Ans.s 等於 007/14 00:27
20F:→ ssccg: Ans a = Ans(50) // 0<50,所以结果Ans.s=50,a.ns=50 07/14 00:28
21F:→ ssccg: Ans b = Ans(125) // 50<125,所以结果Ans.s=125,b.ns=12507/14 00:30
22F:→ ssccg: Ans c = Ans(100) //125>100,所以结果Ans.s不变,c.ns为0 07/14 00:31
23F:→ ssccg: 所谓不管new几个变数都跟static栏位没关,所以static栏位一 07/14 00:32
24F:→ ssccg: 直是同一个,不管在哪个new Ans()里面呼叫都是同一个 07/14 00:34
25F:→ ssccg: "为什麽之後new的变数还要受到影响",Ans()里面就拿Ans.s 07/14 00:34
26F:→ ssccg: 来用,要怎麽不受影响? 程式写怎样不就怎样 07/14 00:35
27F:→ ssccg: 最後print时Ans.s也都是同一个,所以都印出s=125 07/14 00:39
28F:→ ssccg: 如果你真的还看不懂,就把程式里用到s的地方都改成Ans.s再07/14 00:39
29F:→ ssccg: 看一次,跟this.ns就差在一个属於instance一个属於class 07/14 00:40
是我没有表达清楚我的问题,谢谢你耐心的回应,有比较厘清我不了解的地方了,那如果
换了一个class呼叫Ans,才是等於从新载入吗?
30F:→ nmbalance: 我刚学Java一个月都懂前面推文大大辛苦仔细的解说,请07/15 16:24
31F:→ nmbalance: 发文者先认真搞清楚好吗,不要自己不懂就一直觉得是别07/15 16:24
32F:→ nmbalance: 人解释不清楚07/15 16:24
少拍马屁,你才是搞清楚好吗?我并没有说别人解释得不清楚
※ 编辑: birdy1147 (111.80.12.91), 07/15/2016 18:23:21
33F:→ ssccg: 一个class只会被load一次,不管从哪个class呼叫都是同一个 07/15 18:34
34F:→ ssccg: 除非用自订的ClassLoader去管理class载入,不过我想这不在 07/15 18:43
35F:→ ssccg: 基础范围了,通常使用就是不会重新载入了 07/15 18:44
36F:推 gmoz: 阿宣告成static就是只有一个阿,全部同class的instance共用 07/18 11:10
37F:→ gmoz: 当有多数人都用同样的方式回答你 你就要想看看是不是自己 07/18 11:12
38F:→ gmoz: 错了 不要坚持己见 07/18 11:12
39F:→ gmoz: 这个逻辑同样可套用在抓bug上 共勉之 07/18 11:12
40F:→ allen8952: 就我的想法来看,你创造三个物件,可是你在第三次创 07/25 00:48
41F:→ allen8952: 造的时候就已经把static设定为125了所以不管怎麽样s 07/25 00:48
42F:→ allen8952: 一定是抓到125 07/25 00:48
43F:→ allen8952: 你创造新的东西会被归零的是你没有设定static 的 07/25 00:51
44F:→ allen8952: 第三个print出来的ns会为零就是你在创造物件时,判断 07/25 00:55
45F:→ allen8952: 式就不会通过因为125<100是false ,ns就视为零 07/25 00:55
46F:→ allen8952: 以上是我个人见解,自学java一个月也是我第一个语言 07/25 00:57
47F:→ allen8952: ,觉得很好玩 07/25 00:57