繁体   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