为什么一个文件中有两个并行类?

时间:2014-08-21 10:32:18

标签: java android class dialog extends

看下面的hirachy类,我很困惑为什么两个孤立的类可以存在于一个java文件中。

我知道这两个课程彼此有关,但问题是我不清楚他们之间到底有什么关系。

此外,如果您发现NewFileTask延伸TaskDialog.Task而不是TaskDialog,我无法理解这意味着什么,以及它用于什么?谁有人可以帮忙?任何材料或参考供我理解,我们将不胜感激。提前谢谢!

class NewFileTask extends TaskDialog.Task {

    public NewFileTask(String repoID, String parentDir,
                       String fileName, DataManager dataManager) {

        @Override
        protected void runTask() {
        }
    }
}

,接下来是同一个java文件中的类出口

public class NewFileDialog extends TaskDialog {

    public void init(String repoID, String parentDir, Account account) {

    }

    @Override
    protected View createDialogContentView(LayoutInflater inflater, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dialog_new_file, null);
        fileNameText = (EditText) view.findViewById(R.id.new_file_name);

        if (savedInstanceState != null) {
           //...
        }

        return view;
    }
}

如果您想阅读完整的源代码,请go here on github

2 个答案:

答案 0 :(得分:1)

  

我很困惑,为什么两个孤立的类可以存在于一个java文件中。

Java语言规范允许您在编译单元(例如文件)中声明多个顶级类型

Java语法(见JLS 7.3)说:

CompilationUnit:
    [PackageDeclaration] {ImportDeclaration} {TypeDeclaration}

其中[ ... ]表示可选,{ ... }表示零或更多。

此外,编译器允许进行以下限制:

  • 一个文件最多包含 一种public和/或由不同编译单元引用的类型。

  • 所述类型的名称与源文件的名称相匹配。

正如JLS 7.6所解释的那样,这些规则使编译器在查找某些其他编译单元引用的类/接口时,可以轻松确定应检查哪些源代码文件。


  

这是用来做什么的?

嗯,大多数Java程序员都不使用它。大多数Java程序员无论如何都将每种类型放在一个单独的源文件中。

然而,有些人宁愿不在“很多”单独的文件中使用他们的源代码。

“一个文件中的多个顶级类型”功能来自Java 1.0,其中没有类型的嵌套。嵌套类型使此功能变得多余。

答案 1 :(得分:0)

你可以看到只有一个类是公共的,另一个是默认的,这意味着没有编译错误,你可以在一个java文件中添加尽可能多的类,唯一的限制是只有一个顶层class应该是公共的,以便编译器可以为源文件提供该公共类的名称。我认为源代码的作者之所以这样做是因为他选择编写这样的代码,即使两个类之间的依赖关系没有区别,你要么这样写,要么将它们分开(建议将它们分开) 我想也许他认为他们是一个班级。