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

时间:2014-09-03 12:08:08

标签: java oop package member public

我是Java的新手,当时读的是“Thinking in 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!谢谢大家,我知道如果两个代码都在同一个软件包中就行了。但我仍然对书中的陈述感到困惑。这是:

  

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

如果有人能解释我怎么可能,我将不胜感激。

6 个答案:

答案 0 :(得分:0)

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

simple.PublicAccessClasssimple.PrivatePackage.PublicAccessClass不在同一个包中,因此PublicAccessClass无法访问它。如果它们在同一个包中,那么您的代码就可以运行。

答案 1 :(得分:0)

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

花一点时间来读出来

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

在你的情况下 你不能访问方法,因为它没有在包

中声明为public

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

答案 2 :(得分:0)

不,你不能。在我看来,你现在将一个包的成员(一个类)的成员混淆为一个类的方法。

答案 3 :(得分:0)

您的类PrivatePackageClass必须以访问修饰符public开头才能在当前文件之外访问

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

答案 4 :(得分:0)

Public members in package private class

包私有类可以拥有具有公共访问权限或受保护访问权限的成员,但是,无法在包外访问此类成员。

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

我认为该段落的最后一句是单身。

答案 5 :(得分:0)

我已经读过《用Java思考(第四版)》这本书。我对此说法也感到困惑。

在某些情况下,可能与声明不完全匹配,但可能只是作为补充说明。

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

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

  

即使程序中有很多类,也只有main()用于   在命令行上调用的类将被调用。所以在这种情况下   当您说java Detergent时,将调用Detergent.main()。但是你   也可以说要使用Java Cleanser进行调用 Cleanser.main(),即使Cleanser不是公共类即使课程有课程   访问,可以访问公共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:\ 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类是程序包访问;

2类Miscellaneous2简单地从Miscellaneous派生而来,但具有公共访问权限;

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