程序代碼如下:

          這段程序放在<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()
          定義一個(gè)函數(shù)。
          { var target="http://zhoucaiqi.51.net"
          設(shè)置一個(gè)字符串。
          newwindow=window.open("","","
          scrollbars")
          打開一個(gè)新窗口。
          if (document.all)
          { newwindow.moveTo(0,0)
          新窗口從(0,0)位置開始顯示。
          newwindow.resizeTo
          (screen.width,screen.height) }
          新窗口的尺寸是整個(gè)屏幕的寬,整個(gè)屏幕的高。
          newwindow.location=target 顯示target指定的鏈接地址。
          <input type="button" onClick="windowopen()" value="全屏顯示" name="button"> 插入一個(gè)按鈕,擊它的時(shí)候調(diào)用windowopen()函數(shù)。
          posted @ 2009-04-16 13:44 胡鵬 閱讀(9222) | 評(píng)論 (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>
          定義一個(gè)樣式。
          <script language="JavaScript">
          var dragapproved=false
          var z,x,y
          聲明幾個(gè)變量。
          function move()
          { if (event.button==1&&dragapproved)
          定義一個(gè)函數(shù)move(),判斷鼠標(biāo)是否是按下狀態(tài)。
          { z.style.pixelLeft=temp1+event.clientX-x
          z.style.pixelTop=temp2+event.clientY-y
          return false }}
          定義圖片左上角的位置。
          function drags()
          { if (!document.all)
          return
          定義一個(gè)函數(shù)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
          如果鼠標(biāo)左鍵被按下,返回z,temp1,temp2,x,y的值。
          document.onmousemove=move }}
          document.onmousedown=drags
          document.onmouseup=new
          Function("dragapproved=false")
          </script>
          當(dāng)鼠標(biāo)移動(dòng)時(shí),執(zhí)行move()函數(shù),當(dāng)鼠標(biāo)按下的時(shí)候,執(zhí)行drags函數(shù),當(dāng)鼠標(biāo)抬起的時(shí)候,不執(zhí)行任何函數(shù)。
          <img src="img/draw.jpg" class="drag"> 在頁面中插入一張圖片。


          posted @ 2009-04-16 13:40 胡鵬 閱讀(1533) | 評(píng)論 (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());
              }

          }

          可能你覺得應(yīng)該是當(dāng)前年- 1930, 例如:今年是2009,2009-1930= 79,運(yùn)行結(jié)果真的是這樣嗎?
          你運(yùn)行下,額,奇怪,居然是 -1930,  額,為什么呢??

            原來 首先其靜態(tài)域 被設(shè)置為缺省值, TEST先設(shè)置為null, belt設(shè)置為0 , 然后TEST構(gòu)造器計(jì)算出來,但我們已經(jīng)初始化belt了,
          belt被設(shè)置為final, 所以忽略了。。。 
          再來看下 下面一個(gè)簡單的例子,剛開始做的時(shí)候不仔細(xì),哎,, 我錯(cuò)了。。哎~!~ 希望大家不要跟我一樣啊。
           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 }

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

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

          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();
                  
              }

          }


          程序運(yùn)行結(jié)果:
          Dog bark
          Dog bark

          打印出2個(gè)Dog bark,額,原來對(duì)靜態(tài)方法的調(diào)用不存在任何動(dòng)態(tài)的分派機(jī)制。這個(gè)沒有注意很容易搞錯(cuò)的哦~!!~
          posted @ 2009-04-15 19:15 胡鵬 閱讀(466) | 評(píng)論 (6)編輯 收藏
          YUI提供的Event工具集

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

          YUI對(duì)事件響應(yīng)的順序:通過YUI Event工具集添加的事件,默認(rèn)是在冒泡過程中執(zhí)行事件處理函數(shù)的。從DOM節(jié)點(diǎn)上來說,是從子節(jié)點(diǎn)向根節(jié)點(diǎn)響應(yīng)事件。

          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)

          參數(shù):

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

          eventType:為事件類型

          fn:為事件響應(yīng)的回調(diào)函數(shù)

          obj:當(dāng)overridetrue時(shí),為回調(diào)函數(shù)傳入的參數(shù)對(duì)象;當(dāng)overridefalse時(shí),該參數(shù)被忽略。

          override

          返回值類型:Boolean

          功能:給指定的element綁定事件響應(yīng)函數(shù)

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

          參數(shù):

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

          eventType:事件類型

          fn:為事件響應(yīng)函數(shù)

          返回值類型:Boolean

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

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

          參數(shù):

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

          recurseBoolean值,是否解除子節(jié)點(diǎn)的事件綁定

          sType:事件類型

          返回值類型:Boolean

          功能:給指定的element解除綁定的同一類型的事件,也可以解除子節(jié)點(diǎn)上綁定的這一類型的事件

          YAHOO.util.on

          addListener的函數(shù)別名

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

          參數(shù):

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

          p_fn:為事件響應(yīng)函數(shù)

          p_obj:同addListenerobj參數(shù)

          p_override:同addListeneroverride參數(shù)

          返回值類型:

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

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

          參數(shù):

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

          p_fn:為事件響應(yīng)函數(shù)

          p_obj:同addListenerobj參數(shù)

          p_override:同addListeneroverride參數(shù)

          返回值類型:

          功能:onAvailable類似,但不同的是事件響應(yīng)函數(shù)是等到element可以安全的修改的時(shí)候才響應(yīng)。

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

          參數(shù):

          p_fn:為事件響應(yīng)函數(shù)

          p_obj:同addListenerobj參數(shù)

          p_scope:同addListeneroverride參數(shù)

          返回值類型:

          功能:當(dāng)DOM第一次可用時(shí)執(zhí)行響應(yīng)函數(shù)。

          YAHOO.util.Event.preventDefault ( event)

          參數(shù):

          event:事件對(duì)象

          返回值類型:

          功能:阻止事件的缺省行為發(fā)生。

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

                  簡單程序:求2個(gè)數(shù)的最小公倍數(shù) 和 最大公約數(shù)


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

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

              
              
          /**
               * 得到 m,n 的最大公約數(shù)
               * 
          @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 的最小公倍數(shù)
               * 
          @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 胡鵬 閱讀(318) | 評(píng)論 (0)編輯 收藏
             
               算法(Algorithm)是一系列解決問題的清晰指令,也就是說,能夠?qū)σ欢ㄒ?guī)范的輸入,在有限時(shí)間內(nèi)獲得所要求的輸出。如果一個(gè)算法有缺陷,或不適合于某個(gè)問題,執(zhí)行這個(gè)算法將不會(huì)解決這個(gè)問題。不同的算法可能用不同的時(shí)間、空間或效率來完成同樣的任務(wù)。一個(gè)算法的優(yōu)劣可以用空間復(fù)雜度與時(shí)間復(fù)雜度來衡量。

            算法可以理解為有基本運(yùn)算及規(guī)定的運(yùn)算順序所構(gòu)成的完整的解題步驟?;蛘呖闯砂凑找笤O(shè)計(jì)好的有限的確切的計(jì)算序列,并且這樣的步
          驟和序列可以解決一類問題。

               一個(gè)算法應(yīng)該具有以下五個(gè)重要的特征:
                  1、有窮性: 一個(gè)算法必須保證執(zhí)行有限步之后結(jié)束;

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

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

            4、輸出:一個(gè)算法有一個(gè)或多個(gè)輸出,以反映對(duì)輸入數(shù)據(jù)加工后的結(jié)果。沒有輸出的算法是毫無意義的;

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

              計(jì)算機(jī)科學(xué)家尼克勞斯-沃思曾著過一本著名的書《數(shù)據(jù)結(jié)構(gòu)+算法=程序》,可見算法在計(jì)算機(jī)科學(xué)界與計(jì)算機(jī)應(yīng)用界的地位。


          算法的復(fù)雜度

            同一問題可用不同算法解決,而一個(gè)算法的質(zhì)量優(yōu)劣將影響到算法乃至程序的效率。算法分析的目的在于選擇合適算法和改進(jìn)算法。一個(gè)算法的評(píng)價(jià)主要從時(shí)間復(fù)雜度和空間復(fù)雜度來考慮。

            時(shí)間復(fù)雜度

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

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

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

            空間復(fù)雜度

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

          算法設(shè)計(jì)與分析的基本方法

            1.遞推法

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

            2.遞歸

            遞歸指的是一個(gè)過程:函數(shù)不斷引用自身,直到引用的對(duì)象已知

            3.窮舉搜索法

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

            4.貪婪法

            貪婪法是一種不追求最優(yōu)解,只希望得到較為滿意解的方法。貪婪法一般可以快速得到滿意的解,因?yàn)樗∪チ藶檎易顑?yōu)解要窮盡所有可能而必須耗費(fèi)的大量時(shí)間。貪婪法常以當(dāng)前情況為基礎(chǔ)作最優(yōu)選擇,而不考慮各種可能的整體情況,所以貪婪法不要回溯。

            5.分治法

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

            6.動(dòng)態(tài)規(guī)劃法

            動(dòng)態(tài)規(guī)劃是一種在數(shù)學(xué)和計(jì)算機(jī)科學(xué)中使用的,用于求解包含重疊子問題的最優(yōu)化問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動(dòng)態(tài)規(guī)劃的思想是多種算法的基礎(chǔ),被廣泛應(yīng)用于計(jì)算機(jī)科學(xué)和工程領(lǐng)域。

            7.迭代法

            迭代是數(shù)值分析中通過從一個(gè)初始估計(jì)出發(fā)尋找一系列近似解來解決問題(一般是解方程或者方程組)的過程,為實(shí)現(xiàn)這一過程所使用的方法統(tǒng)稱為迭代法。


             算法分類

            算法可大致分為基本算法、數(shù)據(jù)結(jié)構(gòu)的算法、數(shù)論與代數(shù)算法、計(jì)算幾何的算法、圖論的算法、動(dòng)態(tài)規(guī)劃以及數(shù)值分析、加密算法、排序算法、檢索算法、隨機(jī)化算法、并行算法。





           

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

          數(shù)據(jù)結(jié)構(gòu)的基本概念



                數(shù)據(jù):

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

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

                 數(shù)據(jù)項(xiàng)(data item)是數(shù)據(jù)元素中有獨(dú)立含義的、不可分割的最小標(biāo)識(shí)單位。例如,一個(gè)整數(shù)、一個(gè)字符都是原子項(xiàng);一個(gè)學(xué)生數(shù)據(jù)元素包含學(xué)號(hào)、姓名、性別和出生日期等多個(gè)數(shù)據(jù)項(xiàng)組成。

                

          數(shù)據(jù)類型:

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

                 程序中的每一個(gè)數(shù)據(jù)都屬于一個(gè)數(shù)據(jù)類型,決定了數(shù)據(jù)的類型也就決定了數(shù)據(jù)的性質(zhì)以及對(duì)數(shù)據(jù)進(jìn)行的運(yùn)算和操作,同時(shí)數(shù)據(jù)也受到類型的保護(hù),確保數(shù)據(jù)不能進(jìn)行非法操作。

                 高級(jí)程序涉及語言通常預(yù)定一些基本數(shù)據(jù)類型和構(gòu)造數(shù)據(jù)類型?;緮?shù)據(jù)類型的值是不可分解的,它可直接參與該類型所允許的運(yùn)算。構(gòu)造數(shù)據(jù)類型是使用已有的簡單數(shù)據(jù)類型和已定義的構(gòu)造數(shù)據(jù)類型按照一定的語法規(guī)則組織起來的較復(fù)雜的數(shù)據(jù)類型。構(gòu)造數(shù)據(jù)類型的變量包含多個(gè)數(shù)據(jù)項(xiàng)。

                 java語言的基本數(shù)據(jù)類型有整數(shù)類型、浮點(diǎn)數(shù)類型、字符類型、布爾類型,構(gòu)造數(shù)據(jù)類型(引用類型)有數(shù)組、類和接口。

           

          數(shù)據(jù)結(jié)構(gòu)

                 計(jì)算機(jī)處理的數(shù)據(jù)不是雜亂無章的,而是有著內(nèi)在聯(lián)系的。只有分析清楚它們的內(nèi)在聯(lián)系,對(duì)大量的、復(fù)雜的數(shù)據(jù)才能進(jìn)行復(fù)核的組織和有效處理。

                 數(shù)據(jù)結(jié)構(gòu)是指元素之間存在的關(guān)系。一個(gè)數(shù)據(jù)結(jié)構(gòu)(data structure)是由n(n≥0)個(gè)數(shù)據(jù)元素組成的有限集合,數(shù)據(jù)元素之間具有某種特定的關(guān)系。

                 數(shù)據(jù)結(jié)構(gòu)概念包括三方向:數(shù)據(jù)的邏輯結(jié)構(gòu)

                                                           數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)

                                                           數(shù)據(jù)的操作

                 數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)類型兩個(gè)概念的側(cè)重點(diǎn)不同。數(shù)據(jù)類型研究的是每種數(shù)據(jù)所具有的特性,以及對(duì)這種特性的數(shù)據(jù)能夠進(jìn)行哪些操作;數(shù)據(jù)結(jié)構(gòu)研究的是數(shù)據(jù)元素之間具有的相互關(guān)系,數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)元素的數(shù)據(jù)類型無關(guān),也不隨數(shù)據(jù)元素值的變化而變化。

           

          抽象數(shù)據(jù)類型

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

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

                 與使用數(shù)據(jù)類型描述數(shù)據(jù)特性一樣,通常使用抽象數(shù)據(jù)類型描述數(shù)據(jù)結(jié)構(gòu),將線性表、樹、圖等數(shù)據(jù)結(jié)構(gòu)分別定義為抽象數(shù)據(jù)類型,每種抽象數(shù)據(jù)類型描述一種數(shù)據(jù)結(jié)構(gòu)的邏輯特性和操作,與該數(shù)據(jù)結(jié)構(gòu)在計(jì)算機(jī)內(nèi)的存儲(chǔ)及實(shí)現(xiàn)無關(guān)。

                 抽象數(shù)據(jù)類型是軟件模塊化設(shè)計(jì)思想的重要手段。一個(gè)抽象數(shù)據(jù)類型是描述一種特定功能軟件的基本模塊,由各種基本模塊可組織和構(gòu)造起來一個(gè)龐大的軟件系統(tǒng)。

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

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

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


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

           

          下面的程序循環(huán)遍歷byte數(shù)值,以查找某個(gè)特定值。這個(gè)程序會(huì)打印出什么?

          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");
            }

           }

          }



           

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


          上面這個(gè)程序大家應(yīng)該都能理解,但是下面整個(gè)判斷是true還是false呢?
          ( (byte)0x90 == 0x90 ) ,當(dāng)然是false啦,有點(diǎn)java基礎(chǔ)知識(shí)的人都知道會(huì)轉(zhuǎn)化成int比較的,
          但轉(zhuǎn)化后值是多少呢? 這個(gè)這個(gè)。。。。。hoho   (byte)0x90 提升為int數(shù)值-122,而0x90為144


          如果要實(shí)現(xiàn)比較,其實(shí)也很簡單。

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

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

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

          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**************************************************************************************
          下面的程序輸入結(jié)果是什么呢?

          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);
           }


          }

           


          乍一看應(yīng)該慧是100吧。 畢竟做了100次循環(huán)增量。   結(jié)果確是0


          j = j++; 整個(gè)操作細(xì)分開來大家都知道:
          int temp = j;
          j = j+1 ;
          j = temp;

           那如果是這樣那么結(jié)果就不用懷疑了,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}

           

          應(yīng)該是101吧,應(yīng)該,那就是錯(cuò)啦,實(shí)際上是:在for循環(huán)中,出現(xiàn)了無限循環(huán)。
          當(dāng)i達(dá)到Integer.MAX_VALUE時(shí),并且再次執(zhí)行增量操作時(shí),它就又繞回到了Integer.MIN_VALUE。 所以就出現(xiàn)無限循環(huán)。

           


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

          解答(1):int start = Integer.MAX_VALUE-1;   //不信你可以試一試
          解答(2):可以用任何計(jì)算位無窮大的浮點(diǎn)算術(shù)表達(dá)式來實(shí)現(xiàn):
          double i = 1.0/0.0; 一般都使用浮點(diǎn)數(shù)常量:double i = Double.POSITIVE_INFINITY;事實(shí)上,不必將i初始化為無窮大,
          任何足夠大的浮點(diǎn)數(shù)都可以實(shí)現(xiàn)這一目的。例如:double i = 1.0e40;
          解答(3):double i=0.0/0.0; 即:double i = Double.NaN;
          解答(4):把i定義成string類型就可以實(shí)現(xiàn)啦
          解答(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中的條件永遠(yuǎn)為false?
          解答:double i=0.0/0.0; 即:double i = Double.NaN;

           

           

           

           

           

           

           

           

           


           

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

          第一個(gè)程序:
          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!");
                  }

              }

          }


          第二個(gè)程序:
          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}


          第三個(gè)程序:

          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();
              }

          }


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


          分析第二個(gè)程序:
              基于第一個(gè)程序,那么第二個(gè)程序應(yīng)該不可以編譯,但是它卻可以。它之所以可以編譯,是因?yàn)樗ㄒ坏腸atch子句檢查了Exception
             捕獲Exception或Throwable的catch子句是合法的,不管于其相對(duì)應(yīng)的try子句的內(nèi)容為何。  這個(gè)程序什么都不會(huì)打印。


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




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

          導(dǎo)航

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          統(tǒng)計(jì)

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          agile

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 新津县| 萨迦县| 平南县| 奈曼旗| 玉田县| 普宁市| 东乡| 博野县| 睢宁县| 河北省| 城固县| 博白县| 云和县| 墨竹工卡县| 富阳市| 广灵县| 贵州省| 梅河口市| 巴里| 工布江达县| 冕宁县| 商都县| 平潭县| 丹凤县| 霞浦县| 九龙坡区| 大埔区| 新沂市| 武汉市| 汝州市| 靖远县| 班玛县| 昌黎县| 佛学| 喀喇沁旗| 方山县| 西藏| 施秉县| 巫溪县| 江山市| 台湾省|