程序代碼如下:

          這段程序放在<body>與</body>之間
          <script>
          <!--
          function windowopen(){
          var target="http://zhoucaiqi.51.net"
          newwindow
          =window.open("","","scrollbars")
          if (document.all){
          newwindow.moveTo(
          0,0)
          newwindow.resizeTo(screen.width,screen.height)
          }
          newwindow.location
          =target
          }
          //-->
          </script>
          <form>
          <input type="button" onClick="windowopen()" value="全屏顯示" name="button">
          </form>
           
           程序講解:
             


          function windowopen()
          定義一個函數。
          { var target="http://zhoucaiqi.51.net"
          設置一個字符串。
          newwindow=window.open("","","
          scrollbars")
          打開一個新窗口。
          if (document.all)
          { newwindow.moveTo(0,0)
          新窗口從(0,0)位置開始顯示。
          newwindow.resizeTo
          (screen.width,screen.height) }
          新窗口的尺寸是整個屏幕的寬,整個屏幕的高。
          newwindow.location=target 顯示target指定的鏈接地址。
          <input type="button" onClick="windowopen()" value="全屏顯示" name="button"> 插入一個按鈕,擊它的時候調用windowopen()函數。
          posted @ 2009-04-16 13:44 胡鵬 閱讀(9225) | 評論 (0)編輯 收藏
            程序代碼如下:
          <style>
          <!--.drag{position:relative;cursor:hand}
          -->
          </style>
          <script language="JavaScript">
          var dragapproved=false
          var z,x,y
          function move(){
          if (event.button==1&&dragapproved){
          z.style.pixelLeft
          =temp1+event.clientX-x
          z.style.pixelTop
          =temp2+event.clientY-y
          return false
          }}
          function drags(){
          if (!document.all)
          return
          if (event.srcElement.className=="drag"){
          dragapproved
          =true
          z
          =event.srcElement
          temp1
          =z.style.pixelLeft
          temp2
          =z.style.pixelTop 
          x
          =event.clientX
          y
          =event.clientY
          document.onmousemove
          =move
          }}
          document.onmousedown
          =drags
          document.onmouseup
          =new Function("dragapproved=false")
          </script>
                  
          <img src="img/draw.jpg" class="drag">

          程序代碼講解:

          <style>
          <!--.drag{position:relative;cursor:hand} -->
          </style>
          定義一個樣式。
          <script language="JavaScript">
          var dragapproved=false
          var z,x,y
          聲明幾個變量。
          function move()
          { if (event.button==1&&dragapproved)
          定義一個函數move(),判斷鼠標是否是按下狀態。
          { z.style.pixelLeft=temp1+event.clientX-x
          z.style.pixelTop=temp2+event.clientY-y
          return false }}
          定義圖片左上角的位置。
          function drags()
          { if (!document.all)
          return
          定義一個函數drags()。如果是Netscape瀏覽器,就返回。所以此效果,在Netscape瀏覽器中看不到。
          if (event.srcElement.className=="drag")
          { dragapproved=true
          z=event.srcElement
          temp1=z.style.pixelLeft
          temp2=z.style.pixelTop
          x=event.clientX
          y=event.clientY
          如果鼠標左鍵被按下,返回z,temp1,temp2,x,y的值。
          document.onmousemove=move }}
          document.onmousedown=drags
          document.onmouseup=new
          Function("dragapproved=false")
          </script>
          當鼠標移動時,執行move()函數,當鼠標按下的時候,執行drags函數,當鼠標抬起的時候,不執行任何函數。
          <img src="img/draw.jpg" class="drag"> 在頁面中插入一張圖片。


          posted @ 2009-04-16 13:40 胡鵬 閱讀(1539) | 評論 (0)編輯 收藏
            下面的程序輸出什么呢?  考慮下哦。。。。

          public class Test {
              
          public static final Test TEST = new Test();
              
          private final int belt;
              
          private static final int CURRENT_YEAR = Calendar.getInstance().get(Calendar.YEAR);
              
              
          public Test(){
                  belt 
          = CURRENT_YEAR - 1930;
              }

              
          public int getBelt(){
                  
          return belt;
              }

              
          public static void main(String []args) throws Exception{
                  System.out.println(TEST.getBelt());
              }

          }

          可能你覺得應該是當前年- 1930, 例如:今年是2009,2009-1930= 79,運行結果真的是這樣嗎?
          你運行下,額,奇怪,居然是 -1930,  額,為什么呢??

            原來 首先其靜態域 被設置為缺省值, TEST先設置為null, belt設置為0 , 然后TEST構造器計算出來,但我們已經初始化belt了,
          belt被設置為final, 所以忽略了。。。 
          再來看下 下面一個簡單的例子,剛開始做的時候不仔細,哎,, 我錯了。。哎~!~ 希望大家不要跟我一樣啊。
           1 class Point {
           2     protected final int x, y;
           3     private final String name;
           4 
           5     Point(int x, int y) {
           6         this.x = x;
           7         this.y = y;
           8         name = makeName();
           9     }
          10 
          11     protected String makeName() {
          12         return "[" + x + "," + y + "]";
          13     }
          14     
          15     public final String toString(){
          16         return name;
          17     }
          18 
          19 }
          20 
          21 public class ColorPoint extends Point {
          22     private final String color;
          23     
          24     ColorPoint(int x, int y, String color){
          25         super(x,y);
          26         this.color = color;
          27     }
          28     protected String makeName() {
          29         return super.makeName()+":"+color;
          30     }
          31     
          32     public static void main(String[] args) {
          33         System.out.println(new ColorPoint(1,2,"abc"));
          34     }
          35     
          36 }

          運行結果:  [1,2]:null
          程序從main啟動,然后到 25行,super(x,y);   之后 到 第 8行   name = makeName();  再之后29行, return super.makeName()+":"+color;
          這里,方法被子類重載了,運行到26行  this.color = color;  最后結束, 當然輸出: [1,2]:null  

          posted @ 2009-04-15 19:28 胡鵬 閱讀(238) | 評論 (1)編輯 收藏
             
                在繼承中的 使用靜態方法的時候該注意。。。。。
             你覺得下面程序很簡單吧,打印出什么呢? 沒看仔細要錯的哦~!~

          class Dog{
              
          public static void bark(){
                  System.out.println(
          "Dog bark");
              }

          }


          class Basenji extends Dog{
              
          public static void bark(){
                  
              }

          }


          public class Test {
              
          public static void main(String []args) throws Exception{
                  Dog dog 
          = new Dog();
                  Dog basenji 
          = new Basenji();
                  dog.bark();
                  basenji.bark();
                  
              }

          }


          程序運行結果:
          Dog bark
          Dog bark

          打印出2個Dog bark,額,原來對靜態方法的調用不存在任何動態的分派機制。這個沒有注意很容易搞錯的哦~!!~
          posted @ 2009-04-15 19:15 胡鵬 閱讀(473) | 評論 (6)編輯 收藏
          YUI提供的Event工具集

          YUI提供的Event工具集簡化了瀏覽器中事件驅動程序的編寫,提供了一種簡單的接口來定制事件和檢查瀏覽器中的event對象。YUI事件工具集提供了自定義事件對象(Custom Event),通過自定義事件對象可以發布自己感興趣的時刻或事件,頁面中的YUI組件能夠響應這些自定義的事件并做出回應。

          YUI對事件響應的順序:通過YUI Event工具集添加的事件,默認是在冒泡過程中執行事件處理函數的。從DOM節點上來說,是從子節點向根節點響應事件。

          Event需要的引入

          <!-- Dependency -->

          build/yahoo/yahoo-min.js

          <!-- Event source file -->

          build/event/event-min.js

          EventCustom Event分別定義在YAHOO.util.EventYAHOO.util.CustomEvent

          Event工具集提供的方法

          YAHOO.util.Event.addListener(element,eventType,fn,obj,override)

          參數:

          element:為綁定事件的元素id可以是一個數組,以支持批量操作

          eventType:為事件類型

          fn:為事件響應的回調函數

          obj:當overridetrue時,為回調函數傳入的參數對象;當overridefalse時,該參數被忽略。

          override

          返回值類型:Boolean

          功能:給指定的element綁定事件響應函數

          YAHOO.util.Event.removeListener:function(element,eventType,fn)

          參數:

          element:為綁定事件的元素id,

          eventType:事件類型

          fn:為事件響應函數

          返回值類型:Boolean

          功能:給指定的element解除綁定事件

          YAHOO.util.Event.purgeElement ( el , recurse , sType )

          參數:

          el:為綁定事件的元素id,

          recurseBoolean值,是否解除子節點的事件綁定

          sType:事件類型

          返回值類型:Boolean

          功能:給指定的element解除綁定的同一類型的事件,也可以解除子節點上綁定的這一類型的事件

          YAHOO.util.on

          addListener的函數別名

          YAHOO.util.Event.onAvailable ( p_id , p_fn , p_obj , p_override )

          參數:

          p_id:為綁定事件的元素id,

          p_fn:為事件響應函數

          p_obj:同addListenerobj參數

          p_override:同addListeneroverride參數

          返回值類型:

          功能:當指定的elementp_id出現時,執行事件響應函數。如果在頁面初始化之前執行這一函數,當頁面加載時(可能還未完成時),就會執行響應的事件響應函數;如果放在頁面加載之后執行這一函數,將以固定的時間輪詢,當element可用時響應這一事件。這個輪詢的的時間是可以配置的,缺省的時間是10秒一次。

          YAHOO.util.Event.onContentReady ( p_id , p_fn , p_obj , p_override )

          參數:

          p_id:為綁定事件的元素id,

          p_fn:為事件響應函數

          p_obj:同addListenerobj參數

          p_override:同addListeneroverride參數

          返回值類型:

          功能:onAvailable類似,但不同的是事件響應函數是等到element可以安全的修改的時候才響應。

          YAHOO.util.Event.onDOMReady ( p_fn , p_obj , p_scope )

          參數:

          p_fn:為事件響應函數

          p_obj:同addListenerobj參數

          p_scope:同addListeneroverride參數

          返回值類型:

          功能:DOM第一次可用時執行響應函數。

          YAHOO.util.Event.preventDefault ( event)

          參數:

          event:事件對象

          返回值類型:

          功能:阻止事件的缺省行為發生。

          posted @ 2009-04-15 17:28 胡鵬 閱讀(517) | 評論 (0)編輯 收藏

                  簡單程序:求2個數的最小公倍數 和 最大公約數


          public class T {
              
          public static void main(String[] args) {

                  
          int m, n;
                  m
          = 32 ;
                  n 
          = 48;
                  System.out.println(m
          +""+n+"");
                  System.out.println(
          "最大公約數是:" + getGongYue(m,n));
                  System.out.println(
          "最小公倍數是:" + getGongBei(m,n));
              }

              
              
          /**
               * 得到 m,n 的最大公約數
               * 
          @param m
               * 
          @param n
               * 
          @return
               
          */

              
          public static int getGongYue(int m, int n){
                  
          int  r;
                  
          do {
                      
          if (m < n) {
                          
          int t = m;
                          m 
          = n;
                          n 
          = t;
                      }


                      r 
          = m % n;
                      m 
          = n;
                      n 
          = r;
                  }
           while (r != 0);
                  
          return m;
              }

              
              
          /**
               * 得到 m,n 的最小公倍數
               * 
          @param m
               * 
          @param n
               * 
          @return
               
          */

              
          public static long getGongBei(int m,int n){
                  
          return m*n/getGongYue(m,n);
              }

          }
          posted @ 2009-04-12 15:03 胡鵬 閱讀(321) | 評論 (0)編輯 收藏
             
               算法(Algorithm)是一系列解決問題的清晰指令,也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。如果一個算法有缺陷,或不適合于某個問題,執行這個算法將不會解決這個問題。不同的算法可能用不同的時間、空間或效率來完成同樣的任務。一個算法的優劣可以用空間復雜度與時間復雜度來衡量。

            算法可以理解為有基本運算及規定的運算順序所構成的完整的解題步驟。或者看成按照要求設計好的有限的確切的計算序列,并且這樣的步
          驟和序列可以解決一類問題。

               一個算法應該具有以下五個重要的特征:
                  1、有窮性: 一個算法必須保證執行有限步之后結束;

            2、確切性: 算法的每一步驟必須有確切的定義;

            3、輸入:一個算法有0個或多個輸入,以刻畫運算對象的初始情況,所謂0個輸入是指算法本身定除了初始條件;

            4、輸出:一個算法有一個或多個輸出,以反映對輸入數據加工后的結果。沒有輸出的算法是毫無意義的;

            5、可行性: 算法原則上能夠精確地運行,而且人們用筆和紙做有限次運算后即可完成。

              計算機科學家尼克勞斯-沃思曾著過一本著名的書《數據結構+算法=程序》,可見算法在計算機科學界與計算機應用界的地位。


          算法的復雜度

            同一問題可用不同算法解決,而一個算法的質量優劣將影響到算法乃至程序的效率。算法分析的目的在于選擇合適算法和改進算法。一個算法的評價主要從時間復雜度和空間復雜度來考慮。

            時間復雜度

            算法的時間復雜度是指算法需要消耗的時間資源。一般來說,計算機算法是問題規模n 的函數f(n),算法的時間復雜度也因此記做

            T(n)=Ο(f(n))

            因此,問題的規模n 越大,算法執行的時間的增長率與f(n) 的增長率正相關,稱作漸進時間復雜度(Asymptotic Time Complexity)。

            空間復雜度

            算法的空間復雜度是指算法需要消耗的空間資源。其計算和表示方法與時間復雜度類似,一般都用復雜度的漸近性來表示。同時間復雜度相比,空間復雜度的分析要簡單得多。

          算法設計與分析的基本方法

            1.遞推法

            遞推法是利用問題本身所具有的一種遞推關系求問題解的一種方法。它把問題分成若干步,找出相鄰幾步的關系,從而達到目的,此方法稱為遞推法。

            2.遞歸

            遞歸指的是一個過程:函數不斷引用自身,直到引用的對象已知

            3.窮舉搜索法

            窮舉搜索法是對可能是解的眾多候選解按某種順序進行逐一枚舉和檢驗,并從眾找出那些符合要求的候選解作為問題的解。

            4.貪婪法

            貪婪法是一種不追求最優解,只希望得到較為滿意解的方法。貪婪法一般可以快速得到滿意的解,因為它省去了為找最優解要窮盡所有可能而必須耗費的大量時間。貪婪法常以當前情況為基礎作最優選擇,而不考慮各種可能的整體情況,所以貪婪法不要回溯。

            5.分治法

            把一個復雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最后子問題可以簡單的直接求解,原問題的解即子問題的解的合并。

            6.動態規劃法

            動態規劃是一種在數學和計算機科學中使用的,用于求解包含重疊子問題的最優化問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種算法的基礎,被廣泛應用于計算機科學和工程領域。

            7.迭代法

            迭代是數值分析中通過從一個初始估計出發尋找一系列近似解來解決問題(一般是解方程或者方程組)的過程,為實現這一過程所使用的方法統稱為迭代法。


             算法分類

            算法可大致分為基本算法、數據結構的算法、數論與代數算法、計算幾何的算法、圖論的算法、動態規劃以及數值分析、加密算法、排序算法、檢索算法、隨機化算法、并行算法。





           

          posted @ 2009-04-12 14:37 胡鵬 閱讀(264) | 評論 (0)編輯 收藏

          數據結構的基本概念



                數據:

                 數據(data)是描述客觀事物的數字、字符以及所有能夠輸入到計算機中并能被計算機接受的各種符號集合的統稱。數據是信息的符號表示,是計算機程序的處理對象。除了數值數據,計算機能夠處理的數據還可以是各種非數值數據,如字符串、圖形、音頻、視頻等多媒體數據。

                 表示一個事物的一組數據稱為一個數據元素(data element):數據元素是數據的基本單位。一個數據元素可以是一個不可分割的原子項,也可以由多個數據項組成。

                 數據項(data item)是數據元素中有獨立含義的、不可分割的最小標識單位。例如,一個整數、一個字符都是原子項;一個學生數據元素包含學號、姓名、性別和出生日期等多個數據項組成。

                

          數據類型:

                 類型(type)是具有相同邏輯意義的一組值的集合。數據類型(data type)是指一個類型和定義在這個類型上的操作集合。數據類型定義了數據的性質、取值范圍以及對數據所能進行的各種操作。例如,Java語言的整數類型int,除了數值集合[-231,...,-2,-1,0,1,2,...,231-1]之外,還包括在這個值集合上的操作集合[+,-,*,/,%,=]。

                 程序中的每一個數據都屬于一個數據類型,決定了數據的類型也就決定了數據的性質以及對數據進行的運算和操作,同時數據也受到類型的保護,確保數據不能進行非法操作。

                 高級程序涉及語言通常預定一些基本數據類型和構造數據類型。基本數據類型的值是不可分解的,它可直接參與該類型所允許的運算。構造數據類型是使用已有的簡單數據類型和已定義的構造數據類型按照一定的語法規則組織起來的較復雜的數據類型。構造數據類型的變量包含多個數據項。

                 java語言的基本數據類型有整數類型、浮點數類型、字符類型、布爾類型,構造數據類型(引用類型)有數組、類和接口。

           

          數據結構

                 計算機處理的數據不是雜亂無章的,而是有著內在聯系的。只有分析清楚它們的內在聯系,對大量的、復雜的數據才能進行復核的組織和有效處理。

                 數據結構是指元素之間存在的關系。一個數據結構(data structure)是由n(n≥0)個數據元素組成的有限集合,數據元素之間具有某種特定的關系。

                 數據結構概念包括三方向:數據的邏輯結構

                                                           數據的存儲結構

                                                           數據的操作

                 數據結構與數據類型兩個概念的側重點不同。數據類型研究的是每種數據所具有的特性,以及對這種特性的數據能夠進行哪些操作;數據結構研究的是數據元素之間具有的相互關系,數據結構與數據元素的數據類型無關,也不隨數據元素值的變化而變化。

           

          抽象數據類型

                 程序設計語言使用數據類型描述數據特性,采取“表示與實現分離”的策略。語言本身僅提供數據類型的語法規則,并沒有說明這些數據類型是如何實現的;程序員按照這些規則使用數據類型,而不必知道這些數據類型是如何實現的。

                 抽象數據類型(Abstract Data type,ADT)指一個數學模型以及定義在該模型上的一組操作。抽象數據類型和數據類型本質上是一個概念,它的最重要特征是將一個類型上的數據及操作的邏輯含義與具體實現分離

                 與使用數據類型描述數據特性一樣,通常使用抽象數據類型描述數據結構,將線性表、樹、圖等數據結構分別定義為抽象數據類型,每種抽象數據類型描述一種數據結構的邏輯特性和操作,與該數據結構在計算機內的存儲及實現無關。

                 抽象數據類型是軟件模塊化設計思想的重要手段。一個抽象數據類型是描述一種特定功能軟件的基本模塊,由各種基本模塊可組織和構造起來一個龐大的軟件系統。

          posted @ 2009-04-12 14:22 胡鵬 閱讀(725) | 評論 (0)編輯 收藏

          使用StringBuffer時應該注意的:
            StringBuffer sb = new StringBuffer('M');
            sb.append("abc");
            System.out.println(sb.toString());

             該程序會輸出什么呢?   不是 mabc   輸入結果為: abc
             為什么m沒有輸出來呢?奇怪了? 其實也不是很奇怪,StringBuffer沒有字符為參數的構造方法,只有int作為緩沖區初始容量的構造器。
          在本例子中, new StringBuffer('M') 返回的是一個具有初始容量77的空字符串緩沖區。


          **2******************************************************************************************************************

           

          下面的程序循環遍歷byte數值,以查找某個特定值。這個程序會打印出什么?

          public class BigDelight {
           
          public static void main(String[] args) {
            
          for (byte b = Byte.MIN_VALUE; b < Byte.MAX_VALUE; b++{
             
          if (b == 0x90)
              System.out.println(
          "hello");
            }

           }

          }



           

          結果什么都沒有打印。
            0x90是一個兩位數的十六進制字面常量,每一個十六進制位都占據4個比特的位置,
          所以整個數值也只占8個比特,即1個byte。問題在于byte是有符號類型,常量0x90是
          一個正的最高位被置為8位int數值。合法的byte數值是從-128到+127,但是常量0x90等于+144


          上面這個程序大家應該都能理解,但是下面整個判斷是true還是false呢?
          ( (byte)0x90 == 0x90 ) ,當然是false啦,有點java基礎知識的人都知道會轉化成int比較的,
          但轉化后值是多少呢? 這個這個。。。。。hoho   (byte)0x90 提升為int數值-122,而0x90為144


          如果要實現比較,其實也很簡單。

          方法一: 只要我們相同的類型比較就可以啦,蘋果跟蘋果比較,桔子跟桔子比較。
          最上面的程序改成:
          if (b == (byte)0x90)
              System.out.println("hello");
          這就可以打印出來了。

          方法二:
          可以用一個屏蔽碼來消除符號擴展的影響,從而將byte轉化為int,之后就可以拿到一個int與另一個int進行比較了。
          if ( (b & 0xff) == 0x90)
              System.out.println("hello");

             雖然上面的兩種方法都可以,但是避免這類問題的最佳方法還是將常量值移到循環的外面,并在一個常量種定義它。

          1public class BigDelight {
          2 private static final byte TARGET = (byte)0x90;
          3 public static void main(String[] args) {
          4  for (byte b = Byte.MIN_VALUE; b < Byte.MAX_VALUE; b++{
          5   if ( b == TARGET )
          6    System.out.println("hello");
          7  }

          8 }

          9}

           

           




          ****3**************************************************************************************
          下面的程序輸入結果是什么呢?

          public class Incremet {
           
          public static void main(String[] args) {
            
          int j = 0;
            
          for(int i=0;i<100;i++){
             j 
          = j++;
            }

            System.out.println(j);
           }


          }

           


          乍一看應該慧是100吧。 畢竟做了100次循環增量。   結果確是0


          j = j++; 整個操作細分開來大家都知道:
          int temp = j;
          j = j+1 ;
          j = temp;

           那如果是這樣那么結果就不用懷疑了,j=0

          ****4***************************************************************************


          下面的程序輸出什么呢?

           1public class InTheLoop {
           2 public static final int END = Integer.MAX_VALUE;
           3 public static final int START = Integer.MIN_VALUE;
           4 public static void main(String[] args) {
           5  int count = 0;
           6  for(int i=START;i<=END;i++){
           7   count ++;
           8  }

           9  System.out.println(count);
          10 }

          11}

           

          應該是101吧,應該,那就是錯啦,實際上是:在for循環中,出現了無限循環。
          當i達到Integer.MAX_VALUE時,并且再次執行增量操作時,它就又繞回到了Integer.MIN_VALUE。 所以就出現無限循環。

           


          求:尋找一種定義,使得下面的循環一直無限,
             (1). for(int i=start;i<=start+1;i++){}
             (2). while(i== i+1){}
             (3). while(i !=i ){}
             (4). while(i!= i + 0 ){},附加要求,不能使用浮點數類型
             (5). while(i<=j && i>=j && i!=j ){}
             (6). while(i!=0 && i== -i ){} 

          解答(1):int start = Integer.MAX_VALUE-1;   //不信你可以試一試
          解答(2):可以用任何計算位無窮大的浮點算術表達式來實現:
          double i = 1.0/0.0; 一般都使用浮點數常量:double i = Double.POSITIVE_INFINITY;事實上,不必將i初始化為無窮大,
          任何足夠大的浮點數都可以實現這一目的。例如:double i = 1.0e40;
          解答(3):double i=0.0/0.0; 即:double i = Double.NaN;
          解答(4):把i定義成string類型就可以實現啦
          解答(5):Integer i = new Integer(0);  Integer j = new Integer(0);
          解答(6):int i = Integer.MIN_VALUE; 或 long i = Long.MIN_VALUE;

           


          尋找i一種定義,使得 if( i-i == 0 ){} if中的條件永遠為false?
          解答:double i=0.0/0.0; 即:double i = Double.NaN;

           

           

           

           

           

           

           

           

           


           

          posted @ 2009-04-07 22:49 胡鵬 閱讀(288) | 評論 (0)編輯 收藏
           下面三個程序每一個都會打印些什么? 不要假設他們都可以編譯通過:

          第一個程序:
          import java.io.IOException;

          public class Arcane1 {
              
          public static void main(String[] args) {
                  
          try{
                      System.out.println(
          "hello lsbwahaha");
                  }
          catch(IOException e){
                      System.out.println(
          "I've never seen println fail!");
                  }

              }

          }


          第二個程序:
          1public class Arcane2 {
          2    public static void main(String[] args) {
          3        try{
          4            //you have noting nice to say
          5        }
          catch(Exception e){
          6            System.out.println("this can't happen");
          7        }

          8    }

          9}


          第三個程序:

          interface Type1{
              
          void f() throws CloneNotSupportedException;
          }


          interface Type2{
              
          void f() throws InterruptedException;
          }


          interface Type3 extends Type2,Type1{}

          public class Arcane3 implements Type3 {
              
          public void f(){
                  System.out.println(
          "hello lsbwahaha");
              }

              
          public static void main(String[] args) {
                  Type3 t3 
          = new Arcane3();
                  t3.f();
              }

          }


          分析第一個程序:
                  看起來應該會打印出hello lsbwahaha,這個程序不能編譯,因為pringln犯法沒有會拋出任何受檢查異常,
          而IOException 卻正是一個受檢查異常。
          語言規范中描述:如果一個catch子句要捕獲一個類型為E的受檢查異常,而其相對應的try子句不能拋出E的某種子類型的異常,
          那么這就是一個編譯期錯誤。


          分析第二個程序:
              基于第一個程序,那么第二個程序應該不可以編譯,但是它卻可以。它之所以可以編譯,是因為它唯一的catch子句檢查了Exception
             捕獲Exception或Throwable的catch子句是合法的,不管于其相對應的try子句的內容為何。  這個程序什么都不會打印。


          分析第三個程序:
             看起來它也不能編譯。 如果它能編譯,那是為什么呢?
           結果居然能編譯通過。。。。  這個到底是為什么呢?、、、、、、、
               Type3 中 因為每一個接口都限制了方法f可以拋出的受檢查異常集合。一個方法可以拋出的受檢查異常集合是它所適用的所有類型聲明
          要拋出的受檢查異常交集,而不是并集。




          posted @ 2009-04-07 20:51 胡鵬 閱讀(204) | 評論 (0)編輯 收藏
          僅列出標題
          共10頁: First 上一頁 2 3 4 5 6 7 8 9 10 下一頁 

          導航

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統計

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          agile

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 汨罗市| 北京市| 通河县| 赫章县| 科技| 花莲市| 新津县| 满洲里市| 平乡县| 施秉县| 应用必备| 边坝县| 平遥县| 明星| 兴安盟| 庆安县| 仁化县| 潜江市| 石泉县| 江口县| 蓬溪县| 雷波县| 正阳县| 吉安县| 夏邑县| 凤城市| 和平区| 湘阴县| 元江| 张家界市| 句容市| 星座| 遂昌县| 沙雅县| 贵溪市| 化隆| 榆社县| 柏乡县| 大丰市| 会同县| 枝江市|