Java如何知道在本例中使用哪个类?

Java如何知道在本例中使用哪个类?,java,inheritance,Java,Inheritance,我开始学习OOP和继承的原理,在编写一些代码时遇到了这个问题: 假设有一个包包含一个名为ClassA的类。然后,在一个单独的文件夹中,我有另一个名为MyClass的类。在与MyClass相同的文件夹中,我有另一个名为ClassA的类,它与包中的ClassA无关。当我为MyClass编写代码时,我让它扩展ClassA MyClass从哪个类扩展而来?MyClass是继承导入包中的ClassA,还是继承与MyClass位于同一文件夹中的ClassA?代码甚至可以编译吗 在深入举例之前,我试图从理论的

我开始学习OOP和继承的原理,在编写一些代码时遇到了这个问题:

假设有一个包包含一个名为ClassA的类。然后,在一个单独的文件夹中,我有另一个名为MyClass的类。在与MyClass相同的文件夹中,我有另一个名为ClassA的类,它与包中的ClassA无关。当我为MyClass编写代码时,我让它扩展ClassA

MyClass从哪个类扩展而来?MyClass是继承导入包中的ClassA,还是继承与MyClass位于同一文件夹中的ClassA?代码甚至可以编译吗

在深入举例之前,我试图从理论的角度来理解这一点

Java中的包是封装一组类的机制, 接口和子包。许多Java实现都使用 用于管理源文件和类文件的分层文件系统。这很容易 将类文件组织到包中。我们需要做的就是 在同一目录中的相关类文件中,为目录指定一个名称 这与类的用途有关,并在顶部添加一行 声明包名的每个类文件的 作为它们所在的目录名

在java文件的顶部,你有一个import,你可以从什么包中选择什么类,当然,正如@Jason所说的,如果你想要的类在你的包中,你不需要显式地告诉它,编译器也知道,但是如果它在另一个包中,你必须显式地告诉他

假设您在src文件夹中有
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诺凡德维肯斯没有