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

时间:2017-07-06 19:14:47

标签: java inheritance

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

  

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

     

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

我试图从理论的角度来理解这一点,然后再深入研究实例。

4 个答案:

答案 0 :(得分:1)

在这种情况下,要使编译器完全清楚,您可能希望执行extends otherPackage.ClassA之类的操作,并使用完整的引用名称来扩展其他包中的classA。如果你想使用MyClass包中的那个,那么就不要导入另一个ClassA并做extends ClassA

答案 1 :(得分:1)

你所看到的是一种静态范围的语言,它将从其内部范围开始,一直到它的外部范围。 在这种情况下,由于导入类A直接在其首次调用的文件中声明,因此它将使用导入类A并停止。这将是其默认行为。 它不会继续查看打包的A类,因为它已经找到了一个,在同一个类文件中声明。

这是java(静态)范围层次结构的默认行为。

如果它没有在同一个文件中找到导入A类的导入,它会到达其包中搜索一个。

这在声明类似变量时非常有用。做一些研究静态范围语言的工作方式。

如果你更容易理解,你可以通过宣布你想要的A级来明确你的意图。

只是旁注 - 这是一个编程语言问题,而不是直接的java问题,但由于你专门针对java,我们只需要涵盖简单的具体答案。如果您想了解更多信息,我可以指导您(或告诉您)有关静态和动态范围语言的更多信息。

我认为值得注意的是,如果您决定从包中导入两个Class As(您不需要这样做),则必须明确声明您想要的内容。

答案 2 :(得分:0)

  

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

在java文件的顶部,你有导入,你可以选择你的意思是什么类的课程,因为@Jason也说如果你想要它在你的包中的课你不需要告诉它显式和编译器知道,但如果它在另一个包中你必须明确地告诉他。

假设您在src文件夹中有FirstClass.java,而在mycodes文件夹中有另一个,import FirstClass你的意思是FirstClass.java存在于src文件夹中,当你import mycodes.FirstClass时表示mycodes文件夹中的FirstClass。

你的类可以是packag的成员。当你扩展SomeClass类中的类时,你扩展SomeClass你的意思是包A中的SomeClass,如果你想扩展其他包中的其他类与B一样,您必须延长B.SomClass

Here是关于java中包的另一个信息

答案 3 :(得分:0)

由于您不熟悉编程,我将用非常简单的词语解释它。假设有一个名为Salads的包。在该包中,您有一个名为Caesar的类。然后,您有另一个名为People的包。在该包中,您有另一个名为Caesar的类。显然,Salads.Caesar指的是凯撒沙拉,People.Caesar指的是一个名叫凯撒的人。但是这两个类都有相同的名称:Caesar

因此,当你编写java代码时,java会在两个地方查找类定义:

  1. 在同一文件夹中定义的类(因为它们隐含在同一个包中,如果它们位于同一个文件夹中,假设您遵循所有正常规则。
  2. 在任何导入的包中定义的类
  3. 所以问题是问你是否只是在代码中说Caesar,它会将它识别为同一文件夹中的那个或导入包中的那个吗?嗯,这是一个不好问的问题,因为首先,你不应该如此含糊地命名你的课程。其次,如果无法提供帮助,则应始终在代码中引用完全限定名称。

    如果您的意思是People.Caesar,请输入People.Caesar,如果您的意思是Salads.Caesar,请输入Salads.Caesar。不要走捷径。如果没有歧义,您只能选择快捷方式。无论如何,编译器可能会抱怨它要求您指定。除非您将Caesar的所有引用更改为Salads.CaesarPeople.Caesar,否则您的代码将无效。