java 板


LINE

※ 引述《birdy1147 (Allen)》之铭言: : 不好意思,想问个比较基础的问题,我知道题意是要考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过以後,指派给新的物件,应该会是不相关的两个 : 物件? 你从结果推测出的想法是对的, static field会留下来,instance的field才会重来。 首先,你知道全域变数的话,我猜你可能学过C之类的语言吧? 但在Java中不管是static field还是物件的field都不叫做全域变数, field在中文有些人翻译成「成员变数」。 不只是开发者取的名字不一样而已,而是连本质都不一样。 首先讲non-static field这部分跟你说的一样, 每new一次就会指派新的记忆体空间来存放, 所以每个新产生出来的物件内的变数都不会干扰。 再来是static的部分,我想这部分你误会了, 以你的叙述来看,应该是把他当成了跟物件内成员变数一样, 每new一个就会有一个独立的空间,互不干扰吧? 但这样不就会变得跟non-static field一样了吗? 又何必分成两种呢? static的特点是「在记忆体中只有一个」, 而且「不用new,打从一开始就存在」。 所以你才会看到变数s的内容一直没改变。 我不知道你的程式码是哪里来的, 但那样会令人不好理解static与non-static的差别。 我再写个简单的范例给你看看两者个差别。 public class Test{ private static int count; // 纪录数量 private int number; // 纪录自己的号码 public Test(int num){ number=num; count++; } public void print(){ System.out.println("我是"+number +"号,目前加上我已产生"+count+"跟我一样的物件"); } public static void main(String[] args){ new Test(20).print(); new Test(30).print(); new Test(50).print(); } } 编译後会输出: 我是20号,目前加上我已经产生了1个跟我一样的物件 我是30号,目前加上我已经产生了2个跟我一样的物件 我是50号,目前加上我已经产生了3个跟我一样的物件 你会看到我们new了三个Test类别所产生的物件, 三个物件都记得自己被赋予的number。 但count则不一样,count变数是static的, 不管new了几次都是共用一个记忆体位置。 所以每呼叫一次就会在建构子内将原本的数字加一, 运用这个特性就产生了纪录有几个Test物件的效果。 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.132.178.168
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1468426564.A.D7A.html
1F:推 smallmac: 推讲解 07/14 13:54
2F:推 quadro: number=num; 07/14 14:03
感谢提醒!
3F:推 birdy1147: 谢谢,你解释得很清楚,我有比较懂了 07/15 18:35
不客气,其实这是我第一次发表文章与编辑回文XD
4F:推 charlie1081: 长知识了谢~ 07/28 12:10
5F:推 poolongkong: 补充一点,static连宣告都不用就会存在,可以试试 07/30 12:19
6F:→ poolongkong: 看在第一行直接print static变数,并不会有error 07/30 12:19
7F:→ poolongkong: Test.count 07/30 12:20
8F:→ poolongkong: 啊 不过好像需要给初始值 07/30 12:20
field的数字预设是0、物件预设是null 所以我的count的确没有设初始值
9F:→ ssccg: local变数才需要初值,instance、static都有预设值 07/31 04:26
※ 编辑: kyleJ (220.132.178.168), 08/15/2016 23:27:25







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:iOS站内搜寻

TOP