Discussion:
[問題] access modifier的問題
(时间太久无法回复)
Pony
2007-04-29 06:05:41 UTC
Permalink
最近在測試 Java 的 Access Modifier

(public, protected, private, none)

在編譯的時候發生了一件詭異的事情

先附上程式碼:

==Array.java==

package simple;

class Array {
public Array() {
System.out.println( "simple.Array");
}
}

==List.java==

package simple;

public class List {
Array a = new Array();
public Array b = new Array();

public List(){
System.out.println( "com.bruceeckel.util.List");
}
}

==TestLib.java==

import simple.*;

public class TestLib {
public static void main(String[] args) {
// Array is not public accessible.
// Array a = new Array();

List l = new List();

// cannot access a since it’s in package scope
// System.out.println(l.a);
System.out.println(l.b);
}
}


假設目前的路徑是 d:\java\id9455\simple

Array.java 和 List.java 放在 d:\java\id9455\simple

TestLib.java 放在 d:\java\id9455

問題來了

在編譯的時候

如果在 d:\java\id9455\simple 下 javac *.java

可以正常編譯

但如果是:先編譯 Array.java,再編譯 List.java

卻會發生找不到 Array 這個 Class 的問題


根據我對 none 這個 access modifier 的認識

他應該要能夠讓在同一個 Package 裡其他的Class 存取

但錯誤訊息卻找不到這個Class

請問一下這是為什麼呢 謝謝

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.64.169.97
!H45
2007-04-29 06:35:45 UTC
Permalink
※ 引述《id9455 (Pony)》之銘言:
: 最近在測試 Java 的 Access Modifier
: (public, protected, private, none)
: 在編譯的時候發生了一件詭異的事情
: 先附上程式碼:
: ==Array.java==
: package simple;
: class Array {
: public Array() {
: System.out.println( "simple.Array");
: }
: }
: ==List.java==
: package simple;
: public class List {
: Array a = new Array();
^^^^^^^^^^^^^^^^^^^^^^
: public Array b = new Array();
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

這樣的寫法會有問題,最好不要在宣告 member field 的同時指定不是常數的初值
改成以下寫法應該不會有問題:

package simple;
public class List {
Array a;
public Array b;
public List() {
a = new Array();
b = new Array();
System.out.println( "com.bruceeckel.util.List");
}
}

至於為何原來的程式碼會出問題,可能就得等其他人來回答了

: public List(){
: System.out.println( "com.bruceeckel.util.List");
: }
: }
: ==TestLib.java==
: import simple.*;
: public class TestLib {
: public static void main(String[] args) {
: // Array is not public accessible.
: // Array a = new Array();
: List l = new List();
: // cannot access a since it’s in package scope
: // System.out.println(l.a);
: System.out.println(l.b);
: }
: }
: 假設目前的路徑是 d:\java\id9455\simple
: Array.java 和 List.java 放在 d:\java\id9455\simple
: TestLib.java 放在 d:\java\id9455
: 問題來了
: 在編譯的時候
: 如果在 d:\java\id9455\simple 下 javac *.java
: 可以正常編譯
: 但如果是:先編譯 Array.java,再編譯 List.java
: 卻會發生找不到 Array 這個 Class 的問題
: 根據我對 none 這個 access modifier 的認識
: 他應該要能夠讓在同一個 Package 裡其他的Class 存取
: 但錯誤訊息卻找不到這個Class
: 請問一下這是為什麼呢 謝謝


--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.205.85
小安
2007-04-29 06:56:13 UTC
Permalink
※ 引述《id9455 (Pony)》之銘言:
: 假設目前的路徑是 d:\java\id9455\simple
: Array.java 和 List.java 放在 d:\java\id9455\simple
: TestLib.java 放在 d:\java\id9455
: 問題來了
: 在編譯的時候
: 如果在 d:\java\id9455\simple 下 javac *.java
: 可以正常編譯
: 但如果是:先編譯 Array.java,再編譯 List.java

try this:
d:\java\id9455 > javac simple\List.java (就算 Array 沒編譯也沒關係)

如果從結果反推回去的話..
大概可以推敲出是 class path 方面的問題

因為 class path 含有 "當前" 目錄 (其他的 library 這裡就略過不提了)
所以在 d:\java\id9455\simple 下 javac List.java
而 List 又去 import simple.Array;
所以 Compiler 反而會去 d:\java\id9455\simple\simple 下找 Array.java

至於為什麼 javac *.java 沒問題?
為什麼 List.java 明明 package simple;
卻還允許在 d:\java\id9455\simple 下 javac List.java (雖然會找不到 Array)
這部分我就不清楚了


--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.131.67.86
w***@bbs.nsysu.edu.tw
2007-05-03 06:21:55 UTC
Permalink
Post by Pony
最近在測試 Java 的 Access Modifier
(public, protected, private, none)
在編譯的時候發生了一件詭異的事情
先附上程式碼:
==Array.java==
package simple;
class Array {
public Array() {
System.out.println( "simple.Array");
}
}
==List.java==
package simple;
public class List {
Array a = new Array();
public Array b = new Array();
public List(){
System.out.println( "com.bruceeckel.util.List");
}
}
==TestLib.java==
import simple.*;
public class TestLib {
public static void main(String[] args) {
// Array is not public accessible.
// Array a = new Array();
List l = new List();
// cannot access a since it’s in package scope
// System.out.println(l.a);
System.out.println(l.b);
}
}
假設目前的路徑是 d:\java\id9455\simple
Array.java 和 List.java 放在 d:\java\id9455\simple
TestLib.java 放在 d:\java\id9455
問題來了
在編譯的時候
如果在 d:\java\id9455\simple 下 javac *.java
可以正常編譯
但如果是:先編譯 Array.java,再編譯 List.java
卻會發生找不到 Array 這個 Class 的問題
根據我對 none 這個 access modifier 的認識
他應該要能夠讓在同一個 Package 裡其他的Class 存取
但錯誤訊息卻找不到這個Class
請問一下這是為什麼呢 謝謝
我在測試上是沒有任何問題產生的
應該是你的設定上有問題吧
WORK_HOME設定正確了嗎?
CLASSPATH有把WORK_HOME, .這兩個加進去嗎?
--
* Origin: 中山大學-美麗之島BBS * From: 202.173.49.133

继续阅读narkive:
Loading...