![](/img/trans.png)
[英]How can a class see a public member of another class when the member is a private class instance
[英]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.