Java如何知道在本例中使用哪个类?
我开始学习OOP和继承的原理,在编写一些代码时遇到了这个问题: 假设有一个包包含一个名为ClassA的类。然后,在一个单独的文件夹中,我有另一个名为MyClass的类。在与MyClass相同的文件夹中,我有另一个名为ClassA的类,它与包中的ClassA无关。当我为MyClass编写代码时,我让它扩展ClassA MyClass从哪个类扩展而来?MyClass是继承导入包中的ClassA,还是继承与MyClass位于同一文件夹中的ClassA?代码甚至可以编译吗 在深入举例之前,我试图从理论的角度来理解这一点 Java中的包是封装一组类的机制, 接口和子包。许多Java实现都使用 用于管理源文件和类文件的分层文件系统。这很容易 将类文件组织到包中。我们需要做的就是 在同一目录中的相关类文件中,为目录指定一个名称 这与类的用途有关,并在顶部添加一行 声明包名的每个类文件的 作为它们所在的目录名 在java文件的顶部,你有一个import,你可以从什么包中选择什么类,当然,正如@Jason所说的,如果你想要的类在你的包中,你不需要显式地告诉它,编译器也知道,但是如果它在另一个包中,你必须显式地告诉他 假设您在src文件夹中有Java如何知道在本例中使用哪个类?,java,inheritance,Java,Inheritance,我开始学习OOP和继承的原理,在编写一些代码时遇到了这个问题: 假设有一个包包含一个名为ClassA的类。然后,在一个单独的文件夹中,我有另一个名为MyClass的类。在与MyClass相同的文件夹中,我有另一个名为ClassA的类,它与包中的ClassA无关。当我为MyClass编写代码时,我让它扩展ClassA MyClass从哪个类扩展而来?MyClass是继承导入包中的ClassA,还是继承与MyClass位于同一文件夹中的ClassA?代码甚至可以编译吗 在深入举例之前,我试图从理论的
FirstClass.java
,在mycodes文件夹中有另一个import FirstClass
时,您指的是src文件夹中存在的FirstClass.java
,而在import mycodes.FirstClass
时,您指的是mycodes文件夹中的FirstClass
您的类可以是packag的成员。当您扩展包A中的类时,当您扩展某个类时,您指的是包A
中的某个类,如果您想扩展其他包中的其他类,如B
,则必须扩展B.SomClass
是关于java中包的另一个信息,在这种情况下,为了让编译器完全清楚,您可能需要执行类似于扩展其他包.ClassA的
操作,并使用完整引用名从另一个包扩展ClassA。如果您想使用MyClass所在的包中的一个,那么就不要导入另一个ClassA,而是扩展ClassA
您看到的是一种静态范围的语言,它将从内部范围一直扩展到外部范围。
在这种情况下,由于导入类A直接在第一次调用它的文件中声明,它将使用导入类A并停止。这将是它的默认行为。
它不会继续查看打包的类A,因为它发现了一个已经在同一类文件中声明的类
这是java(静态)范围层次结构的默认行为
如果它没有在同一个文件中找到导入的类A的导入,它将伸手到它的包中搜索一个
这在声明like变量时非常有用。研究一下静态作用域语言是如何工作的
如果您更容易理解,那么您可以通过准确地声明您想要哪个类来明确您的意图
这是一个编程语言问题,而不是直接的java问题,但是由于您是专门为java而问的,所以我们只需要介绍简单的特定答案。如果您想了解更多,我可以指导您(或告诉您)更多关于静态范围语言与动态范围语言的信息
我想值得注意的是,如果您决定将这两个类作为甚至从您的包(您不需要这样做)导入,那么您必须明确声明您想要的类。因为您是编程新手,我将用非常简单的词来解释它。假设有一个叫做沙拉的包。在这个包中,您有一个名为
Caesar
的类。然后,您有另一个名为People
的包。在这个包中,您有另一个名为Caesar
的类。显然,沙拉。凯撒
指的是凯撒沙拉,人。凯撒
指的是一个叫凯撒的人。但这两个类的名称相同:Caesar
因此,在编写java代码时,java会在两个地方查找类定义:
Caesar
,它会识别它是在同一个文件夹中还是在导入的包中?好吧,这是一个不好的问题,因为首先,你不应该如此含糊地命名你的类。其次,如果没有帮助,你应该始终参考完全合格的在你的代码中输入你的名字
如果你指的是
People.Caesar
,那么键入People.Caesar
;如果你指的是Salads.Caesar
,那么键入Salads.Caesar
。不要走捷径。只有在没有歧义的情况下,你才能走捷径。编译器可能会抱怨它,要求你指定它。或者你的代码不会工作,除非你改变它将Caesar
的所有引用添加到Salads.Caesar
或People.Caesar
查看import
声明和范围。类由唯一的组合包+类名标识。这强制MyClassA不能在同一个包中出现两次,因此import语句只能选择一个。@L诺凡德维肯斯没有