java - 如何访问私有(private)包类的公共(public)成员?

标签 java oop package member public

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

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: error:
PrivatePackageClass is not public in simple.PrivatePackage; cannot be accessed from outside package
PrivatePackageClass.print(Arrays.toString(args));

那么,访问包私有(private)类的公共(public)成员是不可能的,我是对的吗?

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

As previously mentioned, if you don’t put an access specifier for class access, it defaults to package access. This means that an object of that class can be created by any other class in the package, but not outside the package. However, if a static member of that class is public, the client programmer can still access that static member even though they cannot create an object of that class.

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

最佳答案

我读过这本书《Think in Java》(第四版)。我也对这个说法感到困惑。

有些情况可能与表述不完全相符,但可以作为补充说明。

我不确定这些情况是否适用,感谢您的阅读和欢迎评论。

情况 1:包访问类公共(public)静态 main() 方法可以使用以下方式调用 命令行上的“java”命令,如第 169 页的语句:

Even if you have a lot of classes in a program, only the main( ) for the class invoked on the command line will be called. So in this case, when you say java Detergent, Detergent.main( ) will be called. But you can also say java Cleanser to invoke Cleanser.main( ), even though Cleanser is not a public class. Even if a class has package access, a public main() is accessible.

例如这个目录“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:通过公共(public)派生类调用方法。

例如 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\testMiscellaneous\Miscellaneous2.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类Miscellaneous是包访问;

2 类 Miscellaneous2 简单地派生自 Miscellaneous,但具有公共(public)访问权限;

3类Application驻留在另一个包中,可以通过Miscellaneous2访问Miscellaneous的方法。

关于java - 如何访问私有(private)包类的公共(public)成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25643906/

相关文章:

java - Graphics2D setfont() 严重减慢了 java 应用程序的启动速度

java - 在 Apache CXF JAX-RS 中,如何打开 AUTO_REDIRECT_ALLOW_REL_URI 标志?

c++ - 面向对象 : how to create a function "addFruit" to add fruit into a vector<fruit>

r - 这些包需要从(在 NAMESPACE 文件中)导入

package - 如何删除 sublime text 2 中的包

java - Socket发送大量数据时会自动关闭吗?

java - 如何改变约束偏差?

java - Clone()方法相当于Java中的传值概念吗

php - 为什么 PHP 不允许私有(private) const?

python - 使 cli python 代码与包管理器兼容