这个问题涉及类本身(不是他们的方法或数据)需要声明为公共的地方。
目前我是一名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”类的访问被拒绝。感谢大家。
答案 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'。所以你可以毫无困难地访问课程。请参阅“继承”概念,您将更好地了解访问修饰符。干杯!!