我读过这本书 Think in Java (Fourth Edition)。我也对这种说法感到困惑。
有些情况可能与陈述不完全相符,但可以作为补充说明。
我不确定这些案例是否适用,感谢阅读,欢迎 cmets。
案例1:包访问类的public static 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类Miscellaneous是包访问;
2 类 Miscellaneous2 简单地从 Miscellaneous 派生,但被授予公共访问权限;
3类Application驻留在另一个包中,可以通过Miscellaneous2访问Miscellaneous的方法。