簡體   English   中英

如何訪問私有包類的公共成員?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM