??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩第二十一页,亚洲精品一区二区三区在线观看,国内在线精品http://www.aygfsteel.com/jimingminlovefly/category/51413.htmlzh-cnThu, 24 Jan 2013 14:43:19 GMTThu, 24 Jan 2013 14:43:19 GMT60wait/notify/synchronized http://www.aygfsteel.com/jimingminlovefly/articles/394261.html计明?/dc:creator>计明?/author>Tue, 15 Jan 2013 09:24:00 GMThttp://www.aygfsteel.com/jimingminlovefly/articles/394261.htmlhttp://www.aygfsteel.com/jimingminlovefly/comments/394261.htmlhttp://www.aygfsteel.com/jimingminlovefly/articles/394261.html#Feedback0http://www.aygfsteel.com/jimingminlovefly/comments/commentRss/394261.htmlhttp://www.aygfsteel.com/jimingminlovefly/services/trackbacks/394261.htmlZ说清道理Q我们用“图书馆借书”q个l典例子来作解释?span class="Apple-converted-space"> 

    一本书同时只能借给一个h。现在有一本书Q图书馆已经把这本书借了张三?span class="Apple-converted-space"> 

    在简单的synchrnozed 同步机制下,李四如果惛_,先要d书馆查看书有没有q回来。李四是个心急的人,他每天都d书馆查;而张三看书看得慢Q过了半个月才把书还回来Q结果李四在q半个月里全都白跑了Q浪费了不少交通R?span class="Apple-converted-space"> 

    而如果用wait/notify机制Q李四就不用白忙了。他W一ơ去图书馆时发现书已借走Q就回家静静{待(wait)Q张三把书还掉后Q通知(notify)李四Q李四去图书馆拿书即可。整个过E中Q李四没有白跑,没浪贚w?span class="Apple-converted-space"> 

    回到计算Z界: 
    
       ?nbsp;          --  临界资源Q需互斥地访?span class="Apple-converted-space"> 
    张三Q李?nbsp;     --  两个竞争的线E?span class="Apple-converted-space"> 
坐Rd书馆查书   --  轮询 
      车费          --  CPUI间 
      {待          --  wait 
  通知下一个借书?nbsp;  --  notify 

    也就是说Q若使用单的synchonized机制实现互斥Q会DU程d发v轮询Q若Nơ轮询没有成功,׃生了Nơ的CPUI间费Q如果加上了 wait/notify机制Q就可以避免q些无谓的轮询,节省CPU的消耗?/p>

 

?

java,wait与notify的区?br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />wait与notify是java同步机制中重要的l成部分。结合与synchronized关键字用,可以建立很多优秀的同步模型?br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />     synchronized(this){}{h与public synchronized void method(){.....}
     同步分ؓcȝ别和对象U别Q分别对应着c锁和对象锁。类锁是每个cd有一个,如果static的方法被synchronized关键字修?/span>Q则在这个方法被执行前必获得类锁;对象锁类同?static synchronized是类U别?非static的synchronized和synchronized块都是对象别的,即作用在同一new出来的对象上)
     首先Q?span style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; color: rgb(255,0,255); line-height: 18px; padding-top: 0px">调用一个Object的wait与notify/notifyAll的时候,必须保证调用代码对该Object是同步的Q也是说必d作用{同于synchronized(obj){......}的内部才能够去调用obj的wait与notify/notifyAll三个ҎQ否则就会报错:
     java.lang.IllegalMonitorStateException: current thread not owner
     在调用wait的时候,U程自动释放其占有的对象锁,同时不会ȝ请对象锁。当U程被唤醒的时候,它才再次获得了去获得对象锁的权利?br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />     所以,notify与notifyAll没有太多的区别,只是notify仅唤醒一个线Eƈ允许它去获得锁,notifyAll是唤醒所有等待这个对象的U程q允许它们去获得对象锁,只要是在synchronied块中的代码,没有对象锁是寸步难行的。其实唤醒一个线E就是重新允许这个线E去获得对象锁ƈ向下q行?/span>       Z说一下notifyallQ虽然是Ҏ个wait的对象都调用一ơnotifyQ但是这个还是有序的,每个对象都保存这一个等待对象链Q调用的序是q个铄序。其实启动等待对象链中各个线E的也是一个线E,在具体应用的时候,需要注意一下?br />

当线EA获得了obj锁后Q发现条件condition不满I无法l箋下一处理Q于是线EAwait()?/span>
在另一U程B中,如果B更改了某些条Ӟ使得U程A的condition条g满了,可以唤醒线EAQ?/span>
synchronized(obj) {condition = true;obj.notify();} 

需要注意的概念是:
◆调用obj的wait(), notify()Ҏ前,必须获得obj锁,也就是必d在synchronized(obj) {...} 代码D内?/span>
◆调用obj.wait()后,U程A释放了obj的锁Q否则线EB无法获得obj锁,也就无法在synchronized(obj) {...} 代码D内唤醒A?/span>
◆当obj.wait()Ҏq回后,U程A需要再ơ获得obj锁,才能l箋执行?/span>
◆如果A1,A2,A3都在obj.wait()Q则B调用obj.notify()只能唤醒A1,A2,A3中的一个(具体哪一个由JVM军_Q?/span>
◆obj.notifyAll()则能全部唤醒A1,A2,A3Q但是要l箋执行obj.wait()的下一条语句,必须获得obj锁,因此QA1,A2,A3只有一个有Z获得锁l执行,例如A1Q其余的需要等待A1释放obj锁之后才能l执行?/span>
◆当B调用obj.notify/notifyAll的时候,B正持有obj锁,因此QA1,A2,A3虽被唤醒Q但是仍无法获得obj锁。直到B退出synchronized块,释放obj锁后QA1,A2,A3中的一个才有机会获得锁l箋执行?/span>



]]>
Java里的按g递与引用传?/title><link>http://www.aygfsteel.com/jimingminlovefly/articles/393917.html</link><dc:creator>计明?/dc:creator><author>计明?/author><pubDate>Mon, 07 Jan 2013 08:27:00 GMT</pubDate><guid>http://www.aygfsteel.com/jimingminlovefly/articles/393917.html</guid><wfw:comment>http://www.aygfsteel.com/jimingminlovefly/comments/393917.html</wfw:comment><comments>http://www.aygfsteel.com/jimingminlovefly/articles/393917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/jimingminlovefly/comments/commentRss/393917.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/jimingminlovefly/services/trackbacks/393917.html</trackback:ping><description><![CDATA[<h2>按g递还是按引用传?/h2> <div style="float: left; margin: 3px 5px 0px 0px; color: #555555; line-height: 28px; font-family: 宋体, 'Arial Narrow', arial, serif; background-color: #ffffff"> </div> <div style="margin: 0px; color: #555555; line-height: 28px; font-family: 宋体, 'Arial Narrow', arial, serif; background-color: #ffffff">q个在Java里面是经常被提v的问题,也有一些争论,g最后还有一个所谓的l论Q?#8220;在Java里面参数传递都是按g?#8221;。事实上Q这很容易让惑,下面先分别看看什么是按g递,什么是按引用传递,只要能正理解,至于UC按什么传递就不是个大问题了?/div> <div style="margin: 0px; color: #555555; line-height: 28px; font-family: 宋体, 'Arial Narrow', arial, serif; background-color: #ffffff"> <div style="margin: 0px"></div> <div style="margin: 0px"><strong style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">1Q按g递是什?/strong><br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />指的是在Ҏ调用Ӟ传递的参数是按值的拯传递。示例如下:<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" /><code style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />public class TempTest {<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />private void test1(int a){<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />//做点事情<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />}<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />public static void main(String[] args) {<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />TempTest t = new TempTest();<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />int a = 3;<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />t.test1(a);//q里传递的参数a是按g?br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />}<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />}<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" /></code><br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />按g递重要特点:传递的是值的拯Q也是说传递后׃不相关了?br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />CZ如下Q?br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" /><code style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />public class TempTest {<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />private void test1(int a){<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />a = 5;<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />System.out.println("test1Ҏ中的a==="+a);<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />}<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />public static void main(String[] args) {<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />TempTest t = new TempTest();<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />int a = 3;<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />t.test1(a);//传递后Qtest1Ҏ对变量值的改变不媄响这里的a<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />System.out.println(”mainҎ中的a===”+a);<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />}<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />}<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" /></code><br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />q行l果是:<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />test1Ҏ中的a===5<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />mainҎ中的a===3</div> <div style="margin: 0px"><strong style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">2Q按引用传递是什?/strong><br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />指的是在Ҏ调用Ӟ传递的参数是按引用q行传递,其实传递的引用的地址Q也是变量所对应的内存空间的地址?br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />CZ如下Q?br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" /><code style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />public class TempTest {<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />private void test1(A a){</code></div> <div style="margin: 0px">}<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />public static void main(String[] args) {<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />TempTest t = new TempTest();<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />A a = new A();<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />t.test1(a); //q里传递的参数a是按引用传?br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />}<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />}<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />class A{<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />public int age = 0;<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />}</div> <div style="margin: 0px"><strong style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">3Q按引用传递的重要特点</strong><br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />传递的是值的引用Q也是说传递前和传递后都指向同一个引用(也就是同一个内存空_?br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />CZ如下Q?br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" /><code style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W??public class TempTest {<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W??private void test1(A a){<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W??a.age = 20;<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W??System.out.println("test1Ҏ中的age="+a.age);<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W??}<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W??public static void main(String[] args) {<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W??TempTest t = new TempTest();<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W??A a = new A();<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W??a.age = 10;<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W?0?t.test1(a);<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W?1?System.out.println(”mainҎ中的age=”+a.age);<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W?2?}<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W?3?}<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W?4?class A{<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W?5?public int age = 0;<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W?6?}<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" /></code><br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />q行l果如下Q?br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />test1Ҏ中的age=20<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />mainҎ中的age=20</div> <div style="margin: 0px"><strong style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">4Q理解按引用传递的q程——内存分配C意?/strong><br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />要想正确理解按引用传递的q程Q就必须学会理解内存分配的过E,内存分配C意囑֏以辅助我们去理解q个q程?br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />用上面的例子来进行分析:<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />Q?Q:q行开始,q行W?行,创徏了一个A的实例,内存分配C意如下Q?/div> <div style="margin: 0px"><img style="border-right: medium none; padding-right: 0px; border-top: medium none; padding-left: 0px; padding-bottom: 0px; margin: 0px; vertical-align: top; border-left: medium none; padding-top: 0px; border-bottom: medium none" alt="" src="http://column.ibeifeng.com/images/img/2008/10/chenchen-1.jpg" /></div> <div style="margin: 0px">Q?Q:q行W?行,是修改A实例里面的age的|q行后内存分配示意如下:</div> <div style="margin: 0px"><img style="border-right: medium none; padding-right: 0px; border-top: medium none; padding-left: 0px; padding-bottom: 0px; margin: 0px; vertical-align: top; border-left: medium none; padding-top: 0px; border-bottom: medium none" alt="" src="http://column.ibeifeng.com/images/img/2008/10/chenchen-2.jpg" /></div> <div style="margin: 0px">Q?Q:q行W?0行,是把mainҎ中的变量a所引用的内存空间地址Q按引用传递给test1Ҏ中的a变量。请注意Q这两个a变量是完全不同的Q不要被名称相同所蒙蔽?/div> <div style="margin: 0px">内存分配C意如下Q?/div> <div style="margin: 0px"><img style="border-right: medium none; padding-right: 0px; border-top: medium none; padding-left: 0px; padding-bottom: 0px; margin: 0px; vertical-align: top; border-left: medium none; padding-top: 0px; border-bottom: medium none" alt="" src="http://column.ibeifeng.com/images/img/2008/10/chenchen-3.jpg" /></div> <div style="margin: 0px">׃是按引用传递,也就是传递的是内存空间的地址Q所以传递完成后形成的新的内存示意图如下Q?/div> <div style="margin: 0px"><img style="border-right: medium none; padding-right: 0px; border-top: medium none; padding-left: 0px; padding-bottom: 0px; margin: 0px; vertical-align: top; border-left: medium none; padding-top: 0px; border-bottom: medium none" alt="" src="http://column.ibeifeng.com/images/img/2008/10/chenchen-4.jpg" /><br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />也就是说Q是两个变量都指向同一个空间?/div> <div style="margin: 0px">Q?Q:q行W?行,为test1Ҏ中的变量a指向的A实例的ageq行赋|完成后Ş成的新的内存C意囑֦下:</div> <div style="margin: 0px"><img style="border-right: medium none; padding-right: 0px; border-top: medium none; padding-left: 0px; padding-bottom: 0px; margin: 0px; vertical-align: top; border-left: medium none; padding-top: 0px; border-bottom: medium none" alt="" src="http://column.ibeifeng.com/images/img/2008/10/chenchen-5.jpg" /></div> <div style="margin: 0px">此时A实例的age值的变化是由test1Ҏ引v?/div> <div style="margin: 0px">Q?Q:q行W?行,Ҏ此时的内存示意图Q输出test1Ҏ中的age=20<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />Q?Q:q行W?1行,Ҏ此时的内存示意图Q输出mainҎ中的age=20</div> <div style="margin: 0px"><strong style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">5Q对上述例子的改?/strong><br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />理解了上面的例子Q可能有Z问,那么能不能让按照引用传递的|怺不媄响呢Q就是test1Ҏ里面的修改不影响到mainҎ里面呢?<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />Ҏ是在test1Ҏ里面新new一个实例就可以了。改变成下面的例子,其中W?行ؓ新加的:</div> <div style="margin: 0px"><code style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W??public class TempTest {<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W??private void test1(A a){<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W??a = new A();//新加的一?br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W??a.age = 20;<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W??System.out.println("test1Ҏ中的age="+a.age);<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W??}<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W??public static void main(String[] args) {<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W??TempTest t = new TempTest();<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W??A a = new A();<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W?0?a.age = 10;<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W?1?t.test1(a);<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W?2?System.out.println(”mainҎ中的age=”+a.age);<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W?3?}<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W?4行}<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W?5行class A{<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W?6?public int age = 0;<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />W?7行}<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" /></code></div> <div style="margin: 0px">q行l果为:<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />test1Ҏ中的age=20<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />mainҎ中的age=10</div> <div style="margin: 0px">Z么这ơ的q行l果和前面的例子不一样呢Q还是用内存示意图来理解一?/div> <div style="margin: 0px"><strong style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">6Q再ơ理解按引用传?/strong><br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />Q?Q:q行开始,q行W?行,创徏了一个A的实例,内存分配C意如下Q?br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" /><img style="border-right: medium none; padding-right: 0px; border-top: medium none; padding-left: 0px; padding-bottom: 0px; margin: 0px; vertical-align: top; border-left: medium none; padding-top: 0px; border-bottom: medium none" alt="" src="http://column.ibeifeng.com/images/img/2008/10/chenchen-1.jpg" /></div> <div style="margin: 0px">Q?Q:q行W?0行,是修改A实例里面的age的|q行后内存分配示意如下:</div> <div style="margin: 0px"><img style="border-right: medium none; padding-right: 0px; border-top: medium none; padding-left: 0px; padding-bottom: 0px; margin: 0px; vertical-align: top; border-left: medium none; padding-top: 0px; border-bottom: medium none" alt="" src="http://column.ibeifeng.com/images/img/2008/10/chenchen-2.jpg" /></div> <div style="margin: 0px">Q?Q:q行W?1行,是把mainҎ中的变量a所引用的内存空间地址Q按引用传递给test1Ҏ中的a变量。请注意Q这两个a变量是完全不同的Q不要被名称相同所蒙蔽?/div> <div style="margin: 0px">内存分配C意如下Q?/div> <div style="margin: 0px"><img style="border-right: medium none; padding-right: 0px; border-top: medium none; padding-left: 0px; padding-bottom: 0px; margin: 0px; vertical-align: top; border-left: medium none; padding-top: 0px; border-bottom: medium none" alt="" src="http://column.ibeifeng.com/images/img/2008/10/chenchen-3.jpg" /></div> <div style="margin: 0px">׃是按引用传递,也就是传递的是内存空间的地址Q所以传递完成后形成的新的内存示意图如下Q?/div> <div style="margin: 0px"><img style="border-right: medium none; padding-right: 0px; border-top: medium none; padding-left: 0px; padding-bottom: 0px; margin: 0px; vertical-align: top; border-left: medium none; padding-top: 0px; border-bottom: medium none" alt="" src="http://column.ibeifeng.com/images/img/2008/10/chenchen-4.jpg" /></div> <div style="margin: 0px">也就是说Q是两个变量都指向同一个空间?/div> <div style="margin: 0px">Q?Q:q行W?行,为test1Ҏ中的变量a重新生成了新的A实例的,完成后Ş成的新的内存C意囑֦下:</div> <div style="margin: 0px"><img style="border-right: medium none; padding-right: 0px; border-top: medium none; padding-left: 0px; padding-bottom: 0px; margin: 0px; vertical-align: top; border-left: medium none; padding-top: 0px; border-bottom: medium none" alt="" src="http://column.ibeifeng.com/images/img/2008/10/chenchen-6.jpg" /></div> <div style="margin: 0px">Q?Q:q行W?行,为test1Ҏ中的变量a指向的新的A实例的ageq行赋|完成后Ş成的新的内存C意囑֦下:</div> <div style="margin: 0px"><img style="border-right: medium none; padding-right: 0px; border-top: medium none; padding-left: 0px; padding-bottom: 0px; margin: 0px; vertical-align: top; border-left: medium none; padding-top: 0px; border-bottom: medium none" alt="" src="http://column.ibeifeng.com/images/img/2008/10/chenchen-7.jpg" /></div> <div style="margin: 0px">注意Q这个时候test1Ҏ中的变量a的age被改变,而mainҎ中的是没有改变的?/div> <div style="margin: 0px">Q?Q:q行W?行,Ҏ此时的内存示意图Q输出test1Ҏ中的age=20<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />Q?Q:q行W?2行,Ҏ此时的内存示意图Q输出mainҎ中的age=10</div> <div style="margin: 0px"><strong style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">7Q说?/strong><br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" /><span style="color: red">Q?Q:“在Java里面参数传递都是按g?#8221;q句话的意思是Q按g递是传递的值的拯Q按引用传递其实传递的是引用的地址|所以统U按g递?/span><br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" /><span style="color: red">Q?Q:在Java里面只有</span><span style="color: #0000ff">基本cd</span><span style="color: red">和按照下面这U定义方式的</span><span style="color: #0000ff">String</span><span style="color: red">是按g递,其它的都是按引用传递。就是直接用双引号定义字符串方式:String str = “JavaU塾”;</span><br /><span style="color: red">因ؓStringcd比较ҎQ是不可变字W串Q所以,能你在调用修Ҏ法时Q调用那个方法的字符串把引用地址l了Ҏ的Ş参,再修改的时候,实际上是通过形参修改的,׃修改原来字符串值时Q生了一个新的字W串Q所以Ş参又指向了那个修字符丌Ӏ而调用方法的那个字符串还是指向原来的那个字符Ԍ所以,即调用了修Ҏ法,但是他指向的那个字符串还是没改变?br /></span><a id="AjaxHolder_Comments_CommentList_ctl28_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl28$DeleteLink','')"></a><span style="color: red">其实只是值类型和引用cd作ؓ参数Q都是把q个变量的值复制给了方法的形参。只不过Q值类型变量里面保存的是|而引用变量里保存的是一个对象的地址。由于值类型和引用变量的这U存储方式的不同Q才D通过Ҏ修改后得到的l果不同而已。ƈ没有什么g递和引用传?/span><br /></div></div><img src ="http://www.aygfsteel.com/jimingminlovefly/aggbug/393917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jimingminlovefly/" target="_blank">计明?/a> 2013-01-07 16:27 <a href="http://www.aygfsteel.com/jimingminlovefly/articles/393917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java默认构造函数的作用http://www.aygfsteel.com/jimingminlovefly/articles/374871.html计明?/dc:creator>计明?/author>Tue, 17 Apr 2012 03:32:00 GMThttp://www.aygfsteel.com/jimingminlovefly/articles/374871.htmlhttp://www.aygfsteel.com/jimingminlovefly/comments/374871.htmlhttp://www.aygfsteel.com/jimingminlovefly/articles/374871.html#Feedback0http://www.aygfsteel.com/jimingminlovefly/comments/commentRss/374871.htmlhttp://www.aygfsteel.com/jimingminlovefly/services/trackbacks/374871.html当new一个对象时Q先判断是否调用的构造函数有参数Q?
如果有参敎ͼ则根据参数的个数、类型来自动调用相应
的构造函数构造对象,分配内存Qƈq回对象的引用?

“如果定义了一个带参数的构造方法后Q就一定要定义一?
不带参数的构造方法,否则׃能创建新对象Q无参数Q?#8221;
因ؓ当构造一个类的对象时Q编译器首先判断cL否有
构造函敎ͼ如果没有Q则自动加上一个默认构造函敎ͼ
而一旦发现有构造函数后Q则不再自动加上构造函数?
转而认Z没有用类的合法的构造函数而报出编译错误?/span>

class Person
{
private String name="";
private int age=0;

public Person()
{
   System.out.println("person无参数构造函?);
}

public Person(String name,int age)
{
   this.name=name;
   this.age=age;
   System.out.println("person 2 参数的构造函?);  
}
}

class Student extends Person
{

private String school;
private String grade;

public Student()
{
   System.out.println("student 无参数的构造函?);
}

public Student(String name ,int age,String school)
{
   System.out.println("student 3 参数的构造函?);
}
    public   Student(String name ,int age,String school,String grade)
{
   super(name,age);
   this.school=school;
   this.grade=grade;
   System.out.println("student 4 参数的构造函敎ͼsuper().");
}
}

class Test
{
public static void main(String [] args)
{
   System.out.println("st1:");
   Student st2=new Student();
      System.out.println("---------------------------");
     
   System.out.println("st2:");
   Student st=new Student("zhangshan",76,"武大");
   System.out.println("---------------------------");
  
   System.out.println("st3:");
   Student st3=new Student("lisi",24,"武大","研究?);

}

/*
=======================================
输出如下Q?br />
E:JavaWork>java Test
st1:
person无参数构造函?br />student 无参数的构造函?br />---------------------------
st2:
person无参数构造函?br />student 3 参数的构造函?br />---------------------------
st3:
person 2 参数的构造函?br />student 4 参数的构造函敎ͼsuper().

**************************************

    说明了创Z个子cȝ对象实例的时候,必先调用父类的无参数的构造函敎ͼ默认构造函敎ͼQ假如父cL带参数的构造函敎ͼ那么pȝ不会给它创建无参数的构造函敎ͼq时Q子cd实例化的时候,因ؓ找不到父cȝ默认构造函敎ͼ~译器将会报错,但如果在子类的构造函C指定用父cȝ带参数的构造函数的时候,或者在父类中加一个无参数的构造函敎ͼ׃会报错?/p>

Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q?/p>

我们假设A是B的父c,B是A的子cR?br />
1、如果程序员没有l类A没有提供构造函敎ͼ则编译器会自动提供一个默认的无参数的构造函敎ͼ如果用户提供了自q构造函敎ͼ则编译器׃在提供默认的无参数构造函数?/span>

2、子cB实例化时会自动调用父cA的默认构造函敎ͼ所以如果A的默认的无参数的构造函CؓprivateQ则~译器会报错Q而如果A没有提供默认的无参数的构造函敎ͼ而提供了其他cd的构造函敎ͼ~译器同样会报错Q因为B找不到A的默认无参数构造函数。所以,我们最好给父类A提供一个无参数的构造函数?/span>

3、或者在B的构造函C昄的调用父cA的有参构造函数。superQparameter



]]>
技术-socket通信~程Q详解)http://www.aygfsteel.com/jimingminlovefly/articles/366530.html计明?/dc:creator>计明?/author>Fri, 16 Dec 2011 06:54:00 GMThttp://www.aygfsteel.com/jimingminlovefly/articles/366530.htmlhttp://www.aygfsteel.com/jimingminlovefly/comments/366530.htmlhttp://www.aygfsteel.com/jimingminlovefly/articles/366530.html#Feedback0http://www.aygfsteel.com/jimingminlovefly/comments/commentRss/366530.htmlhttp://www.aygfsteel.com/jimingminlovefly/services/trackbacks/366530.html阅读全文

]]>
վ֩ģ壺 ̨| | ˾| ̨ǰ| | ʯ| ɽ| | | ɽ| | ػ| Ȫ| | | Դ| ӱ| | ԫ| ۷| | | | ƽ| | | ֺ| | ɼ| ˺| | Ļ| ³| | | ϻ| ຣʡ| | | | |