在其包装内真的可以"无公共舱"吗?

she*_*hen 6 java

在"Think in Java"中,作者说:

你只需将"public"关键字留在课堂上,在这种情况下它具有包访问权限.(该类只能在该包中使用.)

为了证明这一点,我创建了一个公共类和一个非公共类:

package com.ciaoshen.thinkinjava.chapter7;
import java.util.*;

//My public class
public class PublicClass {
    //default constructor
    public PublicClass(){
        System.out.println("Hello, I am PublicClass.");
    }
}

//Non public class
//It should be package reachable
class PackageReachableClass {
    //default constructor
    PackageReachableClass(){
        System.out.println("Hi, I am PackageReachableClass.");
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我从同一个包中的另一个类调用它们时:

public class InPackageClass {

/**
 *  MAIN
 *  @param args void
 */
public static void main(String[] args){
    //pubic class can be reached from anywhere
    PublicClass newPublicClass=new PublicClass();
    //non-public-class should be accessable in the same package
    PackageReachableClass newPackageReachableClass =new PackageReachableClass();
}
}
Run Code Online (Sandbox Code Playgroud)

系统警告我:不应该从自己的源文件外部访问非公共类.

/Users/Wei/java/com/ciaoshen/thinkinjava/chapter7/InPackageClass.java:22: warning: auxiliary class PackageReachableClass in ./com/ciaoshen/thinkinjava/chapter7/PublicClass.java should not be accessed from outside its own source file
        PackageReachableClass newPackageReachableClass =new PackageReachableClass();
        ^
/Users/Wei/java/com/ciaoshen/thinkinjava/chapter7/InPackageClass.java:22: warning: auxiliary class PackageReachableClass in ./com/ciaoshen/thinkinjava/chapter7/PublicClass.java should not be accessed from outside its own source file
        PackageReachableClass newPackageReachableClass =new PackageReachableClass();
                                                            ^
2 warnings
Hello, I am PublicClass.
Hi, I am PackageReachableClass.
Run Code Online (Sandbox Code Playgroud)

所以我的问题就出现了:无公共类仍然可以打包吗?如果这完全合法,为什么Java禁止我们从同一个包中的另一个文件中调用它们?

cri*_*007 1

这只是一个警告,表明您已经定义了辅助类

PublicClass.java 中的辅助类 PackageReachableClass

这意味着您有一个包含 2 个类的 Java 文件,这违反了Java 代码约定。(强调我的)。

每个 Java 源文件都包含一个公共类或接口。当私有类和接口与公共类关联时,可以将它们放在与公共类相同的源文件中。公共类应该是文件中的第一个类或接口。

为了正确测试您的包私有类,请根据类名将两个类分成单独的文件,即PublicClass.javaPackageReachableClass.java