我是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!谢谢大家,我知道如果两个代码都在同一个软件包中就行了。但我仍然对书中的陈述感到困惑。这是:
如前所述,如果您没有为类访问设置访问说明符,则默认为包访问。这意味着该类的对象可以由包中的任何其他类创建,但不能在包外部创建。但是,如果该类的静态成员公开,则客户端程序员仍然可以访问该静态成员,即使他们无法创建那个班。
如果有人能解释我怎么可能,我将不胜感激。
答案 0 :(得分:0)
PublicAccessClass
具有包私有访问权限,因此只有其包中的类才能访问它。
simple.PublicAccessClass
与simple.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的方法。