夢想飛翔

          自強不息
          posts - 111, comments - 30, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          JAVA代碼查錯

          Posted on 2007-05-21 11:55 love1563 閱讀(122) 評論(0)  編輯  收藏
          149 JAVA 代碼查錯
          1.
          abstract?class?Name?{
          ???private?String?name;
          ???public?abstract?boolean?isStupidName(String?name)?{}
          }
          大俠們,這有何錯誤 ?
          答案 :? 錯。 abstract?method 必須以分號結尾,且不帶花括號。
          2.
          public?class?Something?{
          ???void?doSomething?()?{
          ???????private?String?s?=?"";
          ???????int?l?=?s.length();
          ???}
          }
          有錯嗎 ?
          答案 :? 錯。局部變量前不能放置任何訪問修飾符 ?(private public ,和 protected) final 可以用來修飾局部變量
          (final 如同 abstract strictfp ,都是非訪問修飾符, strictfp 只能修飾 class method 而非 variable)
          3.
          abstract?class?Something?{
          ???private?abstract?String?doSomething?();
          }
          這好像沒什么錯吧 ?
          答案 :? 錯。 abstract methods 不能以 private 修飾。 abstract methods 就是讓子類 implement( 實現 ) 具體細節的,怎么可以用 private abstract
          method
          封鎖起來呢 ??( 同理, abstract?method 前不能加 final)
          4.
          public?class?Something?{
          ???public?int?addOne(final?int?x)?{
          ???????return?++x;
          ???}
          }
          這個比較明顯。
          答案 :? 錯。 int?x 被修飾成 final ,意味著 x 不能在 addOne?method 中被修改。
          5.
          public?class?Something?{
          ???public?static?void?main(String[]?args)?{
          ???????Other?o?=?new?Other();
          ???????new?Something().addOne(o);
          ???}
          ???public?void?addOne(final?Other?o)?{
          ???????o.i++;
          ???}
          }
          class?Other?{
          ???public?int?i;
          }
          和上面的很相似,都是關于 final 的問題,這有錯嗎 ?
          答案 :? 正確。在 addOne?method 中,參數 o 被修飾成 final 。如果在 addOne?method 里我們修改了 o reference
          (
          比如 :?o?=?new?Other();) ,那么如同上例這題也是錯的。但這里修改的是 o member?vairable
          (
          成員變量 ) ,而 o reference 并沒有改變。
          6.
          class?Something?{
          ????int?i;
          ????public?void?doSomething()?{
          ????????System.out.println("i?=?"?+?i);
          ????}
          }?
          有什么錯呢 ?? 看不出來啊。
          答案 :? 正確。輸出的是 "i?=?0" int?i 屬於 instant?variable?( 實例變量,或叫成員變量 ) instant?variable default?value int default?value 0
          7.
          class?Something?{
          ????final?int?i;
          ????public?void?doSomething()?{
          ????????System.out.println("i?=?"?+?i);
          ????}
          }
          和上面一題只有一個地方不同,就是多了一個 final 。這難道就錯了嗎 ?
          答案 :? 錯。 final?int?i 是個 final instant?variable?( 實例變量,或叫成員變量 ) final instant?variable 沒有 default?value ,必須在 constructor?( 構造器 ) 結束之前被賦予一個明確的值。可以修改為 "final?int?i?=?0;"
          8.
          public?class?Something?{
          ?????public?static?void?main(String[]?args)?{
          ????????Something?s?=?new?Something();
          ????????System.out.println("s.doSomething()?returns?"?+?doSomething());
          ????}
          ????public?String?doSomething()?{
          ????????return?"Do?something?...";
          ????}
          }
          ?
          看上去很完美。
          答案 :? 錯。看上去在 main call?doSomething 沒有什么問題,畢竟兩個 methods 都在同一個 class 里。但仔細看, main static 的。 static?method 不能直接 call?non-static?methods 。可改成 "System.out.println("s.doSomething()?returns?"?+?s.doSomething());" 。同理, static?method 不能訪問 non-static?instant?variable
          9.
          此處, Something 類的文件名叫 OtherThing.java
          class?Something?{
          ????private?static?void?main(String[]?something_to_do)?{????????
          ????????System.out.println("Do?something?...");
          ????}
          }
          ?
          這個好像很明顯。
          答案 :? 正確。從來沒有人說過 Java Class 名字必須和其文件名相同。但 public?class 的名字必須和文件名相同。
          10
          interface??A{
          ???int?x?=?0;
          }
          class?B{
          ???int?x?=1;
          }
          class?C?extends?B?implements?A?{
          ???public?void?pX(){
          ??????System.out.println(x);
          ???}
          ???public?static?void?main(String[]?args)?{
          ??????new?C().pX();
          ???}
          }
          答案:錯誤。在編譯時會發生錯誤 ( 錯誤描述不同的 JVM 有不同的信息,意思就是未明確的 x 調用,兩個 x 都匹配(就象在同時 import?java.util java.sql 兩個包時直接聲明 Date 一樣)。對于父類的變量 , 可以用 super.x 來明確,而接口的屬性默認隱含為 ?public?static?final. 所以可以通過 A.x 來明確。
          11.
          interface?Playable?{
          ????void?play();
          }
          interface?Bounceable?{
          ????void?play();
          }
          interface?Rollable?extends?Playable,?Bounceable?{
          ????Ball?ball?=?new?Ball("PingPang");
          }
          class?Ball?implements?Rollable?{
          ????private?String?name;
          ????public?String?getName()?{
          ????????return?name;
          ????}
          ????public?Ball(String?name)?{
          ????????this.name?=?name;????????
          ????}
          ???public?void?play()?{
          ????????ball?=?new?Ball("Football");
          ????????System.out.println(ball.getName());
          ????}
          }
          這個錯誤不容易發現。
          答案 :? 錯。 "interface?Rollable?extends?Playable,?Bounceable" 沒有問題。 interface 可繼承多個 interfaces ,所以這里沒錯。問題出在 interface?Rollable 里的 "Ball?ball?=?new?Ball("PingPang");" 。任何在 interface 里聲明的 interface?variable?( 接口變量,也可稱成員變量 ) ,默認為 public?static?final 。也就是說 "Ball?ball?=?new?Ball("PingPang");" 實際上是 "public?static?final?Ball?ball?=?new?Ball("PingPang");" 。在 Ball 類的 Play() 方法中, "ball?=?new?Ball("Football");" 改變了 ball reference ,而這里的 ball 來自 Rollable?interface Rollable?interface 里的 ball public?static?final 的, final object 是不能被改變 reference 的。因此編譯器將在 "ball?=?new?Ball("Football");" 這里顯示有錯。
          28 、設計 4 個線程,其中兩個線程每次對 j 增加 1 ,另外兩個線程對 j 每次減少 1 。寫出程序。
          以下程序使用內部類實現線程,對 j 增減的時候沒有考慮順序問題。
          public?class?ThreadTest1{
          ??private?int?j;
          ??public?static?void?main(String?args[]){
          ThreadTest1?tt=new?ThreadTest1();
          Inc?inc=tt.new?Inc();
          Dec?dec=tt.new?Dec();
          for(int?i=0;i<2;i++){
          Thread?t=new?Thread(inc);
          t.start();
          t=new?Thread(dec);
          t.start();
          }
          }
          ??private?synchronized?void?inc(){
          j++;
          System.out.println(Thread.currentThread().getName()+"-inc:"+j);
          ??}
          ??private?synchronized?void?dec(){
          j--;
          System.out.println(Thread.currentThread().getName()+"-dec:"+j);
          ??}
          ??class?Inc?implements?Runnable{
          public?void?run(){
          for(int?i=0;i<100;i++){
          inc();
          }
          }
          ??}
          ??class?Dec?implements?Runnable{
          public?void?run(){
          for(int?i=0;i<100;i++){
          dec();
          }
          ?}
          ??}
          }

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 当涂县| 陆良县| 望城县| 中西区| 清原| 彝良县| 九台市| 内江市| 平乡县| 济宁市| 无为县| 临沭县| 松桃| 平顺县| 祁门县| 来凤县| 广宁县| 奉节县| 乌鲁木齐县| 丹凤县| 环江| 米易县| 壶关县| 怀来县| 道孚县| 三亚市| 鄢陵县| 武邑县| 始兴县| 岳西县| 民丰县| 东兴市| 永康市| 安多县| 吕梁市| 绥芬河市| 宾阳县| 兴文县| 奇台县| 绥江县| 印江|