星期一, 4月 19, 2010

2010-04-19_Java_SL100-2

2010-04-19_Java_SL100-2

classpath
  • 類別檔所在的資料夾位置
  • 要求編譯好的類別檔必須放在這個資料夾, 可以設定多個資料夾

Notes:
  • 攥寫Java 程式的第一步都是定義類別
  • 關鍵字都是小寫
  • 套件儘量用小寫
  • 類別如果沒有設定公開 ( public ), 那就只有該套件( package )可以使用, 別的套件不能使用

Package 就是資料夾

舉例來說, 如果原來的程式內容為

public class HelloWorld {
    public static void main(String args[]) {
        System.out.println("Hello Java !");
    }
}

這個時候編譯以及執行是ok的
但是如果修改程式的內容,  加入package 設定

package a; // 加入  package
public class HelloWorld {
    public static void main(String args[]) {
        System.out.println("Hello Java !");
    }
}

這個時候來編譯及執行會有問題

> javac HelloWorld.java 
> java HelloWorld
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: a/HelloWorld)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:632)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:319)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:264)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:332)
Could not find the main class: HelloWorld. Program will exit.

因為有定義 package, 所以這個程式應該是要在 a 資料夾底下
 
所以作法為
>mkdir   a                                            [建立 a 資料夾]
>mv   HelloWorld.class    a                [將 HelloWorld.class 移動到 a 資料夾下]
>java   a.HelloWorld                            [執行的時候 指定  a.HelloWorld 或是 a/HelloWorld ]

這樣才能成功的被執行

但是這樣很麻煩
所以一樣的情形, 也可以在編譯的時候 使用 -d 來指定目的地資料夾
man  javac 得到的資訊如下

-d directory
                Set the destination directory for class files. The destination
                directory must already exist; javac will not create the desti-
                nation  directory. If a class is part of a package, javac puts
                the class file in a subdirectory reflecting the package  name,
                creating directories as needed. For example, if you specify -d
                /home/myclasses and the class is called com.mypackage.MyClass,
                then  the  class  file  is  called /home/myclasses/com/mypack-
                age/MyClass.class.

所以簡單的方式為
>javac   -d  .   HelloWorld.java      ( -d 為目的地資料夾 )

編譯完之後檢查一下
> ls
a  HelloWorld.java
> ls  a
HelloWorld.class

執行方式為
> java a/HelloWorld
Hello Java !
> java a.HelloWorld
Hello Java !

Notes:
  • 在不同套件下要使用要 import 對方的套件還有類別
  • 要有 public static void main 才能被執行

Lab: 認識 public

>vi  ClassA.java

package a;
public class ClassA
    {
        public int a=7;
    }

>vi  ClassB.java

package b;
import a.ClassA;//匯入ClassA

public class ClassB
    {
    public static void main(String[] args)
        {
            ClassA obj; 
            obj = new ClassA();//產生物件參考
            System.out.println("變數 a ="+obj.a);
        }
    }

編譯 ClassA 以及 ClassB

> javac  -d  .   ClassA.java 
> javac  -d  .   ClassB.java 

執行 ClassB

> java   b.ClassB
變數 a =7

如果將 ClassA.java 內的public  拿掉就會發現 ClassB就會產生錯誤













沒有留言: