![](/img/trans.png)
[英]How can a class see a public member of another class when the member is a private class instance
[英]How can I access public member of private package class?
我是Java的新手,當時正在閱讀“用Java思考”。 因此,當我嘗試理解“訪問控制”一章時,我已經讀到有可能加入包私有類的公共成員,對此有些困惑。 因此,我決定檢查此語句,但是當我嘗試編譯此類代碼時,出現錯誤。 這是一個簡單的例子:
PrivatePackageClass.java:
package simple.PrivatePackage;
class PrivatePackageClass {
public static void print(Object obj) {
System.out.println(obj);
}
}
PublicAccessClass.java
package simple;
import simple.PrivatePackage.*;
import java.util.*;
public class PublicAccessClass {
public static void main(String[] args) {
PrivatePackageClass.print(Arrays.toString(args));
}
}
那就是錯誤的描述:
PublicAccessClass.java:8: 錯誤 :
PrivatePackageClass在simple.PrivatePackage中不是公共的; 無法從外部包訪問
PrivatePackageClass.print(Arrays.toString(參數));
因此,我對訪問私有包類的公共成員沒有簡單的可能性嗎?
UPD! 謝謝大家,我知道,如果這兩段代碼都在同一個程序包中,那就可以了。 但是我仍然對書中的陳述感到困惑。 這里是:
如前所述,如果您沒有為類訪問添加訪問說明符,則默認為包訪問。 這意味着該類的對象可以由包中的任何其他類創建,但不能在包外部創建。 但是,如果該類的靜態成員是public ,則客戶端程序員即使無法創建該類的對象,仍然可以訪問該靜態成員。
如果有人能解釋一下我將如何,我將不勝感激。
PublicAccessClass
具有包私有訪問權限,因此只有其包中的類才能訪問它。
simple.PublicAccessClass
不在同一個包simple.PrivatePackage.PublicAccessClass
,因此PublicAccessClass
不能訪問它。 如果它們在同一軟件包中,則您的代碼將起作用。
這將幫助您理解java中訪問成員背后的概念
花一點時間讀出來
http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
在您的情況下,您無法訪問方法,因為該方法未在其包中聲明為公共方法
和默認成員只能在同一軟件包中訪問。
不,你不能。 在我看來,您現在將包(即類)的成員與類的方法混淆了。
您的類PrivatePackageClass必須帶有公共訪問修飾符,才能在當前文件外部進行訪問
要回答第二個查詢,靜態成員/方法不需要創建要訪問的類的對象。 靜態成員屬於一個類,而不特定於一個對象
包私有類可以具有具有公共或受保護訪問權的成員,但是,不能在包外部訪問該成員。
“如前所述,如果不為類訪問添加訪問說明,則默認為包訪問。這意味着該類的對象可以由包中的任何其他類創建,但不能在包外部創建。請記住,同一目錄中所有沒有顯式包聲明的文件都隱式屬於該目錄的默認包。)但是,如果該類的靜態成員是公共的,則客戶端程序員仍可以訪問該靜態成員。即使他們無法創建該class.package的對象。”
我認為該段的最后一句表示單例。
我已經讀過《用Java思考(第四版)》這本書。 我對此說法也感到困惑。
在某些情況下,可能與聲明不完全匹配,但可以作為補充說明。
我不確定這些情況是否適用,感謝您的閱讀和評論。
情況1 : 可以在命令行上使用“ java”命令 來調用 包訪問類的public static main()方法 ,如第169頁上的語句:
即使程序中有很多類,也只會調用在命令行上調用的類的main()。 因此,在這種情況下,當您說java Detergent時,將調用Detergent.main()。 但是, 即使Cleanser不是公共類 ,您也可以說java Cleanser調用 Cleanser.main()。 即使類具有包訪問權限,也可以訪問公共main() 。
例如,在此目錄“ testThinkingInJava \\ src \\ main \\ java \\”中有一些文件(.java”和“ .class”):
testMiscellaneous \\ Miscellaneous.java:
package testMiscellaneous;
class Miscellaneous {
public static void main(String[] args) {
System.out.println("public static void main(String[] args) called");
}
}
testMiscellaneous / Miscellaneous.class(使用“ javac”命令生成)
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package testMiscellaneous;
class Miscellaneous {
Miscellaneous() {
}
public static void main(String[] var0) {
System.out.println("public static void main(String[] args) called");
}
}
運行此命令時:
java -classpath C:\projects\testThinkingInJava\src\main\java testMiscellaneous.Miscellaneous
您可以這樣獲得輸出:
PS C:\Users\pie> java -classpath C:\projects\testThinkingInJava\src\main\java testMiscellaneous.Miscellaneous
public static void main(String[] args) called
PS C:\Users\pie>
如您所見,Miscellaneous類的可見性是程序包訪問(在.java和.class文件中),並且調用了main方法。
情況2 : 通過公共派生類調用該方法。
例如C:\\ projects \\ testThinkingInJava \\ src \\ main \\ java \\ testMiscellaneous \\ Miscellaneous.java
package testMiscellaneous;
class Miscellaneous {
public static String staticMember = "staticMember";
public static String staticMethod() {
String s = "staticMethod";
System.out.println("public static String staticMethod() called");
return s;
}
public static void main(String[] args) {
System.out.println("public static void main(String[] args) called");
}
}
C:\\項目\\ testThinkingInJava的\\ src \\主\\ java的\\ testMiscellaneous \\ Miscellaneous2.java
package testMiscellaneous;
public class Miscellaneous2 extends Miscellaneous {
}
C:\\項目\\ testThinkingInJava的\\ src \\主\\ java的\\ testThinkingInJava \\ Application.java
package testThinkingInJava;
import testMiscellaneous.Miscellaneous2;
public class Application {
String s = Miscellaneous2.staticMember;
public static void main(String[] args) {
Miscellaneous2 miscellaneous2 = new Miscellaneous2();
String s2 = Miscellaneous2.staticMethod();
System.out.println(s2);
System.out.println(Miscellaneous2.staticMember);
}
}
運行應用程序時,可以獲得輸出:
public static String staticMethod() called
staticMethod
staticMember
如你看到的:
雜項是一類。
2類Miscellaneous2簡單地從Miscellaneous派生而來,但具有公共訪問權限;
3類Application駐留在另一個程序包中,並且可以通過Miscellaneous2訪問Miscellaneous的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.