何时在类定义中需要“公共”?

时间:2013-03-24 15:55:33

标签: java

这个问题涉及本身(不是他们的方法或数据)需要声明为公共的地方。

目前我是一名Java noob,只用非常基础的自学。我熟悉其他几种语言,但在Java中我只编写了非常基本的程序,比如一个主类中的所有内容(一个文件)。

所以今天我决定尝试新的东西,并将类放在单独的文件中。让我感到惊讶的是,当我在一个单独的文件中放置一个类时,即使它没有标记为“public”,主类程序也可以访问该类。

为了一个明确的例子,假设我在一个文件夹中有两个文件。文件“mainprog.java”包含以下内容:

class mainprog {
    public static void main(String[] args) {
        hello myHello = new hello();
        myHello.sayHello();
    }
}

并提交包含以下内容的“hello.java”:

class hello {
    void sayHello() {
    System.out.println("Hello world");
    }
}

“hello”中没有任何内容被指定为public,但是这会编译并运行

javac mainprog.java
java mainprog

所以我只是想知道类定义真的需要“公共”吗?

编辑以添加新信息 正如下面的答案所示,我尝试在每个文件中添加一个“package”语句,以便从不同的包中创建它们。正如预期的那样,除非我将类“hello”和它的方法“sayHello()公开”,否则对“hello”类的访问被拒绝。感谢大家。

3 个答案:

答案 0 :(得分:1)

这两个类都是 package-private 。它们都位于同一个文件夹中,因此两个类都可以看到彼此。

如果一个类位于包外,或者另一个类中的另一个类需要访问这些类,则它将无法使用。

Here's a reference to Oracle's visibility of methods/classes/fields.

答案 1 :(得分:1)

包装定义

  

Java包是一种将Java类组织成名称空间的机制,类似于Modula的模块。 Java包可以存储在称为JAR文件的压缩文件中,允许类作为一个组而不是一次一个地更快地下载。程序员通常还使用包来组织属于同一类别或提供类似功能的类。

     

包为它包含的类型提供唯一的命名空间。       同一个包中的类可以访问彼此的包访问成员。

使用公共课程。

当你想从另一个包中创建这个类的对象时。

假设您在Demo包中有一个类。

Demo package.
  Demo.java

两个班都在不同的包中。

Demo1 package
   Demo1.java

现在你想在Demo1.java中创建一个Demo.java类的对象,它们位于不同的包中,然后你需要将Demo类定义为public。

阅读此docs

答案 2 :(得分:1)

默认情况下,同一个包[或文件夹]下的所有类都有一个访问修饰符'protected'。所以你可以毫无困难地访问课程。请参阅“继承”概念,您将更好地了解访问修饰符。干杯!!