隨筆 - 100  文章 - 50  trackbacks - 0
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          我收藏的一些文章!

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          在C盤的根目錄中新建一個子目錄,名為“JavaTest”,以作為存放Java源代碼的地方。打開XP中的記事本,先將其保存到JavaTest文件夾中,在“文件名”文本框中輸入"Hello.java"。注意,在文件名的前后各加上一個雙引號,否則,記事本就會將其存為"Hello.java.txt"的文本文件。然后輸入以下代碼:
          public class Hello {
            public static void main(String[] args) {
              System.out.println("Hello, world");
            }

          再次保存文件。
          在命令行窗口中輸入
          cd C:\JavaTest
          將當前路徑轉入JavaTest中。然后,輸入
          javac Hello.java
          由于我們是在源代碼的當前路徑下編譯,因此,不會出現classpath設置有誤的問題。
          在命令行窗口中輸入java Hello,屏幕出現了
          Hello world
          因此一切正常。下面我們開始人為地將問題復雜化,在非當前工作路徑中編譯及運行,看看結果如何。
          在命令行窗口中輸入
          cd C:
          轉入到C盤根目錄上,當前路徑離開了存放源碼的工作區。輸入
          javac Hello.java
          屏幕出現:
          error: cannot read: Hello.java
          1 error
          找不到Hello.java了。我們要給它指定一個路徑,告訴它到C:\JavaTest去找Hello.java文件。輸入
          javac C:\JavaTest\Hello.java
          OK,這回不報錯了,編譯成功。
          輸入
          java C:\JavaTest\Hello
          這回屏幕出現:
          Exception in thread "main" java.lang.NoClassDefFoundError: C:\JavaTest\Hello
             意思為在“C:\JavaTest\Hello”找不到類的定義。明明C:\JavaTest\Hello是一個.class文件,為什么就找不到呢?原來,Java對待.java文件與.class文件是有區別的。對.java文件可以直接指定路徑給它,而java命令所需的.class文件不能出現擴展名,也不能指定額外的路徑給它。
          那么,如何指定路徑呢?對于Java所需的.class文件,必須通過classpath來指定。
             依照第5步,彈出“環境變量”窗口,在用戶變量中新建一個變量,變量名為“classpath”,變量值為"C:\JavaTest"。一路按“確定”退出。關閉原命令行窗口,打開新的命令行窗口,輸入
          java Hello
          “Hello world”出來了。由此可見,在“環境變量”窗口中設置classpath的目的就是告訴JDK,到哪里去尋找.class文件。這種方法一旦設置好,以后每次運行java或javac時,在需要調用.class文件時,JDK都會自動地來到這里尋找。因此,這是一個全局性的設置。

             除了這種在環境變量”窗口中設置classpath的方法之外,還有另一種方法,即在java命令后面加上一個選項classpath,緊跟著不帶擴展名的class文件名。例如,
          java -classpath C:\JavaTest Hello
              JDK遇到這種情況時,先根據命令行中的classpath選項中指定的路徑去尋找.class文件,找不到時再到全局的classpath環境變量中去尋找。這種情況下,即使是沒有設置全局的classpath環境變量,由于已經在命令行中正確地指定類路徑,也可以運行。
              為了在下面的例子中更好地演示classpath的問題,我們先將全局的classpath環境變量刪除,而在必要時代之以命令行選項-classpath。彈出“環境變量”窗口,選中“classpath”的變量名,按“刪除”鍵。
              此外,java命令中還可以用cp,即classpath的縮寫來代替classpath,如java -cp C:\JavaTest Hello。特別注意的是,JDK 1.5.0之前,javac命令不能用cp來代替classpath,而只能用classpath。而在JDK 1.5.0中,java及javac都可以使用cp及classpath。因此,為保持一致,建議一概使用classpath作為選項名稱。

            我們再次人為地復雜化問題。關閉正在編輯Hello.java的記事本,然后將JavaTest文件夾名稱改為帶空格的“Java Test”。在命令行中輸入
          javac C:\Java Test\Hello.java
          長長的洋文又出來了,但這回卻是報錯了:
          javac: invalid flag: C:\Java
              JDK將帶有空格的C:\Java Test分隔為兩部分"C:\Java"及"Test\Hello.java",并將C:\Java視作為一個無效的選項了。這種情況下,我們需要將整個路徑都加上雙引號,即
          javac "C:\Java Test\Hello.java"
          這回JDK知道,引號里面的是一個完整的路徑,因此就不會報錯了。同樣,對java命令也需要如此,即
          java -classpath "C:\Java Test" Hello
              對于長文件名及中文的文件夾,XP下面可以不加雙引號。但一般來說,加雙引號不容易出錯,也容易理解,因此,建議在classpath選項中使用雙引號。   我們再來看.java文件使用了其他類的情況。在C:\Java Test中新建一個Person.java文件,內容如下:
             public class Person {
             private String name;
             public Person(String name) {
              this.name = name;
             }
             public String getName() {
              return name;
             }
           }
          然后,修改Hello.java,內容如下:
          public class Hello {
            public static void main(String[] args) {
              Person person = new Person("Mike");
              System.out.println(person.getName());
            }

          在命令行輸入
          javac "C:\Java Test\Hello.java"
          錯誤來了:
          C:\Java Test\Hello.java:3: cannot find symbol
          symbol: class Person
          JDK提示找不到Person類。為什么javac "C:\Java Test\Hello.java"在第14步中可行,而在這里卻不行了呢?第14步中的Hello.java文件并沒有用來其他類,因此,JDK不需要去尋找其他類,而到了這里,我們修改了Hello.java,讓其使用了一個Person類。  根據第11步,我們需要告訴JDK,到哪里去找所用到的類,即使這個被使用的類就與Hello.java一起,同在C:\Java Test下面!輸入
          javac -classpath "C:\Java Test" "C:\Java Test\Hello.java"
          編譯通過,JDK在C:\Java Test文件夾下同時生成了Hello.class及Person.class兩個文件。實際上,由于Hello.java使用了Person.java類,JDK先編譯生成了Person.class,然后再編譯生成Hello.class。因此,不管Hello.java這個主類使用了多少個其他類,只要編譯這個類,JDK就會自動編譯其他類,很方便。輸入
          java -classpath "C:\Java Test" Hello
          屏幕出現了
          Mike
          成功。
             說明了在Hello.java中如何使用一個我們自己創建的Person.java,而且這個類與Hello.java是同在一個文件夾下。在這一步中,我們將考查Person.java如果放在不同文件夾下面的情況。
          先將C:\Java Test文件夾下的Person.class文件刪除,然后在C:\Java Test文件夾下新建一個名為DF的文件夾,并將C:\Java Test文件夾下的Person.java移動到其下面。在命令行輸入
          javac -classpath "C:\Java Test\DF" "C:\Java Test\Hello.java" (注意這里不用;區分,用空格就可以!)
          編譯通過。這時javac命令沒有什么不同,只需將classpath改成C:\Java Test\DF就行了。
          在命令行輸入
          java -classpath "C:\Java Test" Hello
              這時由于Java需要找在不同文件夾下的兩個.class文件,而命令行中只告訴JDK一個路徑,即C:\Java Test,在此文件夾下,只能找到Hello.class,找不到Person.class文件,因此,錯誤是可以預料得到的:
          Exception in thread "main" java.lang.NoClassDefFoundError: Person
                  at Hello.main(Hello.java:3)
              果真找不到Person.class。在設置兩個以上的classpath時,先將每個路徑以雙引號引起來,再將這些路徑以“;”號隔開,并且每個路徑與“;”之間不能帶有空格。因此,我們在命令行重新輸入:
          java -classpath "C:\Java Test";"C:\Java Test\DF" Hello
              編譯成功。但也暴露出一個問題,如果我們需要用到許多分處于不同文件夾下的類,那這個classpath的設置豈不是很長!有沒有辦法,對于一個文件夾下的所有.class文件,只指定這個文件夾的classpath,然后讓JDK自動搜索此文件夾下面所有相應的路徑?有,只要使用package。
              package簡介。Java中引入package的概念,主要是為了解決命名沖突的問題。比如說,在我們的例子中,我們設計了一個很簡單的Person類,如果某人開發了一個類庫,其中恰巧也有一個Person類,當我們使用這個類庫時,兩個Person類出現了命名沖突,JDK不知道我們到底要使用哪個Person類。更有甚者,當我們也開發了一個很龐大的類庫,無可避免地,我們的類庫中與其他人開發的類庫中命名沖突的情況就會越來越多。總不能為了避免自己的類名與其他人開發的類名相同,而讓每個編程人員都絞盡腦汁地將一個本應叫Writer的類強行改名為SarkuyaWriter,MikeWriter, SmithWriter吧?
             自定義package的名稱可以由各個程序員自由創建。作為避免命名沖突的手段,package的名稱最好足以與其他程序員的區別開來。在互聯網上,每個域名都是唯一的,因此,Sun推薦將你自己的域名倒寫后作為package的名稱。如果你沒有自己的域名,很可能只是因為囊中羞澀而不去申請罷了,并不見得你假想的域名與其他域名發生沖突。例如,筆者假想的域名是sarkuya.com,目前就是唯一的,因此我的package就可以定名為com.sarkuya。謝謝Java給了我們一個免費使用我們自己域名的機會,唯一的前提是倒著寫。當然,每個package下面還可以帶有不同的子package,如com.sarkuya.util,com.sarkuya.swing,等等。
              定義package的方式是在相應的.java文件的第一行加上“package packagename;”的字樣,而且每個.java文件只能有一個package。實際上,Java中的package的實現是與計算機文件系統相結合的,即你有什么樣的package,在硬盤上就有什么樣的存放路徑。例如,某個類的package名為com.sarkuya.util,那么,這個類就應該必須存放在com/sarkuya/util的路徑下面。至于這個com/sarkuya/util又是哪個文件夾的子路徑,
              package除了有避免命名沖突的問題外,還引申出一個保護當前package下所有類文件的功能,主要通過為類定義幾種可視度不同的修飾符來實現:public, protected, private, 另外加上一個并不真實存在的friendly類型。

              對于冠以public的類、類屬變量及方法,包內及包外的任何類均可以訪問;protected的類、類屬變量及方法,包內的任何類,及包外的那些繼承了此類的子類才能訪問;private的類、類屬變量及方法,包內包外的任何類均不能訪問;如果一個類、類屬變量及方法不以這三種修飾符來修飾,它就是friendly類型的,那么包內的任何類都可以訪問它,而包外的任何類都不能訪問它(包括包外繼承了此類的子類),因此,這種類、類屬變量及方法對包內的其他類是友好的,開放的,而對包外的其他類是關閉的。

              前面說過,package主要是為了解決命名沖突的問題,因此,處在不同的包里面的類根本不用擔心與其他包的類名發生沖突,因為JDK在默認情況下只使用本包下面的類,對于其他包,JDK一概視而不見:“眼不見心不煩”。如果要引用其他包的類,就必須通過import來引入其他包中相應的類。只有在這時,JDK才會進行進一步的審查,即根據其他包中的這些類、類屬變量及方法的可視度來審查是否符合使用要求。如果此審查通不過,編譯就此卡住,直至你放棄使用這些類、類屬變量及方法,或者將被引入的類、類屬變量及方法的修飾符改為符合要求為止。如果此審查通過,JDK最后進行命名是否沖突的審查。如果發現命名沖突,你可以通過在代碼中引用全名的方式來顯式地引用相應的類,如使用
          java.util.Date = new java.util.Date()
            package的第三大作用是簡化classpath的設置。還記上面的命令,這里重新引用其java命令:
          java -classpath "C:\Java Test";"C:\Java Test\DF" Hello

              我們必須將所有的.class文件的路徑一一告訴JDK,而不管DF其實就是C:\Java Test的子目錄。如果要用到100個不同路徑的.class文件,我們就得將classpath設置為一個特別長的字符串,很累。package的引入,很好地解決了這個問題。package的與classpath相結合,通過import指令為中介,將原來必須由classpath完成的類路徑搜索功能,很巧妙地轉移到import的身上,從而使classpath的設置簡潔明了。我們先看下面的例子。
           先在Hello.java中導入DF.Person。代碼修改如下:
            import DF.Person;
           public class Hello {
            public static void main(String[] args) {
              Person person = new Person("Mike");
              System.out.println(person.getName());
            }

          再將DF子文件夾中的Person.java設置一個DF包。代碼修改如下:
          package DF;
          public class Person {
            private String name;
            public Person(String name) {
              this.name = name;
            }
            public String getName() {
              return name;
            }

          好了,神奇的命令行出現了:

          javac -classpath "C:\Java Test" "C:\Java Test\Hello.java"
          java -classpath "C:\Java Test" Hello
          (在我的jdk1.6上,沒有設置classpath,上面的兩條命令可以簡化為:
             javac  Hello.java
             java    Hello
           呵呵,不知道是什么原因啊!


          posted on 2008-10-09 16:19 fly 閱讀(257) 評論(0)  編輯  收藏 所屬分類: java學習
          主站蜘蛛池模板: 若羌县| 拜泉县| 镇巴县| 都江堰市| 竹溪县| 乐陵市| 巴青县| 句容市| 太谷县| 平顶山市| 翁源县| 通江县| 盐源县| 金乡县| 宁化县| 姚安县| 黄冈市| 建德市| 定襄县| 越西县| 辽阳县| 中西区| 抚顺市| 安宁市| 平谷区| 武平县| 攀枝花市| 湖州市| 界首市| 蕉岭县| 靖边县| 和田县| 当雄县| 洛南县| 丽江市| 西华县| 灌南县| 枞阳县| 邯郸县| 宁南县| 金湖县|