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
執行 ClassB
> java b.ClassB
變數 a =7
如果將 ClassA.java 內的public 拿掉就會發現 ClassB就會產生錯誤
沒有留言:
張貼留言