Java 如何访问私有包类的公共成员?

Java 如何访问私有包类的公共成员?,java,oop,package,member,public,Java,Oop,Package,Member,Public,我是Java方面的新手,我正在阅读“用Java思考”。因此,当我试图理解“访问控制”一章时,我读到有可能访问包私有类的public成员,对此感到有点困惑。所以我决定检查这个语句,但是当我试图编译这样的代码时,我得到了一个错误。这里有一个简单的例子: PrivatePackageClass.java: package simple.PrivatePackage; class PrivatePackageClass { public static void print(Object obj

我是Java方面的新手,我正在阅读“用Java思考”。因此,当我试图理解“访问控制”一章时,我读到有可能访问包私有类的public成员,对此感到有点困惑。所以我决定检查这个语句,但是当我试图编译这样的代码时,我得到了一个错误。这里有一个简单的例子:

PrivatePackageClass.java:

package simple.PrivatePackage;

class PrivatePackageClass {
    public static void print(Object obj) {
        System.out.println(obj);
    }
}
package simple;

import simple.PrivatePackage.*;
import java.util.*;

public class PublicAccessClass {
    public static void main(String[] args) {
        PrivatePackageClass.print(Arrays.toString(args));
    }
}
publiccessclass.java

package simple.PrivatePackage;

class PrivatePackageClass {
    public static void print(Object obj) {
        System.out.println(obj);
    }
}
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中不是公共的;无法从软件包外部访问
privatepackegclass.print(Arrays.toString(args))

我说的对吗,访问包私有类的公共成员是不可能的

UPD谢谢大家,我知道如果两段代码都在同一个包中,就可以了。但我仍然对书中的陈述感到困惑。在这里:

如前所述,如果不为类访问设置访问说明符,则默认为包访问。这意味着该类的对象可以由包中的任何其他类创建,但不能在包外创建。但是,如果该类的静态成员是公共,则客户端程序员仍然可以访问该静态成员,即使他们无法创建该类的对象


如果有人能向我解释这是怎么回事,我将不胜感激

PublicAccessClass
具有包私有访问权限,因此只有包中的类才能访问它


simple.publiccessclass
simple.PrivatePackage.publiccessclass
不在同一个包中,因此
publiccessclass
无法访问它。如果它们在同一个包中,您的代码就可以工作。

这将帮助您理解在java中访问成员背后的概念

花点时间把它读出来

就你而言 您无法访问方法,因为它在其包中未声明为公共


默认成员只能在同一个包中访问。

不,不能。在我看来,您现在将包的成员(类)与类的方法混淆了。

您的类PrivatePackageClass前面必须有访问修饰符public,才能在当前文件之外访问它

要回答第二个查询,静态成员/方法不需要创建要访问的类的对象。静态成员属于类,而不是特定于对象

包私有类可以具有具有公共或受保护访问权限的成员,但是,不能在包外部访问此类成员

如前所述,如果不为类访问设置访问说明符,则默认为包访问。这意味着该类的对象可以由包中的任何其他类创建,但不能在包外部创建。(请记住,同一目录中没有显式包声明的所有文件都是该目录默认包的隐式部分。)但是,如果该类的静态成员是公共的,则客户端程序员仍然可以访问该静态成员,即使他们无法创建该类的对象。包。“


我想这段话的最后一句意思是singleton。

我读过这本书《用Java思考》(第四版)。我也对这句话感到困惑

有些情况可能与声明不完全相符,但可以作为补充解释

我不确定这些案例是否适用,感谢阅读并欢迎评论

案例1:可以使用命令行上的“java”命令调用包访问类的public static main()方法,如第169页的语句

即使一个程序中有很多类,也只有 将调用在命令行上调用的类。因此在本例中, 当您说java洗涤剂时,将调用delitine.main()。但是您 也可以说java Cleaner调用Cleaner.main(),,即使Cleaner不是公共类,即使类有包 访问时,可以访问公共main()

e、 g.在“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”命令生成)

运行此命令时:

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:通过公共派生类调用方法

e、 g。 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:\projects\testThinkingInJava\src\main\java\testMiscellaneous2.java

package testMiscellaneous;

public class Miscellaneous2 extends Miscellaneous {
}
C:\projects\testThinkingInJava\src\main\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
如你所见:

1类杂项为包访问

2类杂项2仅来源于杂项,但可供公众查阅

3类应用程序驻留在另一个包中,可以通过Miscellaneous2访问Miscellaneous2的方法。

我现在正在读这本书《思考Java》(两年后第二次),遇到了您引用的一句奇怪的话:)书中似乎有一个错误,当然,您甚至不能将包访问类导入到其他包中,更不用说访问它的任何成员了。