【问题标题】:multiple classes and main method in Java, and packages, namespacesJava中的多个类和main方法,以及包、命名空间
【发布时间】:2012-06-10 01:28:39
【问题描述】:

在 Eclipse 中,.java 文件名必须与类名相同。在任何情况下都是真的还是仅适用于 Eclipse?对于 main 方法,它看起来像 C 中的 main 函数,但问题是,如果我有两个类都有自己的 main 方法并且可以将它们链接在一起怎么办?另外,我可以在一个 .java 文件中编写两个类吗?我在Windows中使用Eclipse,它与Linux版本相同吗?

对于包,我的书告诉我包是一个目录。所以要指定一个文件所属的包,我只需要说“package my_pack”吗?我是否需要创建一个类似 /src/my_pack 的目录并将我的 .java 文件放入其中?

第三,什么是命名空间?它与包和类有什么关系?

【问题讨论】:

    标签: java namespaces packages


    【解决方案1】:

    1) 它是 Java 的东西。文件名必须与文件中的公共类匹配。如果没有公共类,你几乎可以命名任何东西。如果您有两个具有 main 方法的类,则一个可以调用另一个。它们像在 C 中一样链接在一起。只是相互编译。你可以在同一个文件中有两个类;只有一个可以公开。 Eclipse 在各个操作系统中都非常相似。有一些差异可以解释操作系统的差异。

    2) my_pack 没有遵循良好的命名约定。 my.pack 或 com.my 是一个更好的名称。但是,是的,你想创建那个目录。

    3) Java 不使用术语命名空间,但我 wikipedia 说包就像命名空间。

    【讨论】:

    • 如果 .java 文件中没有公共类怎么办?我的意思是,既然没有人是公开的,那么谁可以访问这些课程?对于两个都具有 main 方法的类,“一次可以调用另一个”是什么意思?你的意思是一个main方法可以调用另一个main,比如secondclass.main(),还是编译后一个程序可以调用另一个程序运行?如果是前一种情况,我们只想编译第一个类,对吧?
    • 如果没有公共类,同一个包中的其他类可以访问它。一个主要方法将包含 SecondClass.main(args) ,它会调用另一个。您需要在某个时候同时编译这两个文件,以便 .class 文件存在。
    • 但是既然两个main方法都可以运行并且都编译了,那么系统怎么知道哪一个才是真正的main呢?这听起来像是 C 中的两个主要函数,系统可能会将它们混合在一起。
    • 它运行你告诉它的那个。如果您运行“java ClassOne”,它将运行位于 ClassOne 中的 main 方法。如果你运行“java ClassTwo”,它将运行位于 ClassTwo 中的 main 方法。
    • 只是在这里补充一下,@user1229490 似乎对 Java 代码的编译方式感到困惑。你看,每个类,即使在一个文件中有数百个类,也会在它自己的 .class 文件中编译。然后,您通过指定名称告诉java 您要运行哪一个。您指定的应该有一个public static void main 方法。
    【解决方案2】:

    在 Eclipse 中,.java 文件名必须与类名相同。在任何情况下都是如此还是仅适用于 Eclipse?

    java 文件必须与包含的公共类同名。

    对于 main 方法,它看起来像 C 中的 main 函数,但问题是,如果我有两个类都有自己的 main 方法并且可以将它们链接在一起怎么办?

    是的,您可以在同一个项目中拥有两个具有 static void main(String[] args) {...} 方法的类,但只有 1 个是您项目的主类,您应该通过在清单文件中声明它来决定哪一个。

    阅读更多信息:

    另外,我可以在一个 .java 文件中编写两个类吗?

    可以,只要文件中只有一个类并且该类的名称与文件名相同即可:

    TheClass.java 文件

    package edu.home.bean;
    
    public class TheClass {
        class SomeClass {
        }
    }
    
    class AnotherClass {
    }
    

    编辑:

    如果您没有定义对某个类的公共访问权限,它可能具有defaultprivate 访问权限,具体取决于声明的位置。在上面的示例中,SomeClass 将具有 private 访问权限,并且只能由 TheClass 访问,而 AnotherClass 可以从同一包中的任何类访问。这意味着,与edu.home.bean 不同的包中的类无法访问AnotherClass

    package edu.home.control;
    
    public class ControlClass {
        //this line compiles fine
        private TheClass x;
        //compilation error, it can't access for being in a different package
        private AnotherClass y;
        //compilation error, it can't access because its scope works only in TheClass
        private SomeClass z;
    }
    

    我在Windows下使用Eclipse,和Linux版本一样吗?

    Java 的一个好处是代码独立于平台(不像 C 或 C++),因此您可以将代码从 Windows 移植到 Linux,反之亦然,只要 Java 虚拟机 (JVM) 安装在您要运行/开发 Java 项目的操作系统。

    对于包,我的书告诉我包是一个目录。所以要指定一个文件所属的包,我只需要说“package my_pack”吗?

    是的,这本书是对的。当您有一个 Java 项目(如 MyFirstJavaProject)时,您可以设置一个源文件夹以及该文件夹中的包。这些包将是您的源文件夹的子文件夹。一个例子:

    Eclipse 中的项目结构:

    + MyFirstJavaProject
      + src
        + edu.home.bean
        + edu.home.control
        + edu.home.gui
        + another.package
    
    
    + MyFirstJavaProject
      + src
        + edu
          + home
            + bean
              ... class files
            + control
              ... class files
            + gui
              ... class files
        + another
          + package
    

    我是否需要创建一个类似 /src/my_pack 的目录并将我的 .java 文件放入其中?

    您可以手动完成,或者让您的 IDE(在本例中为 Eclipse)为您完成,就像在包中创建包和类一样简单。

    第三,什么是命名空间?它与包和类有什么关系?

    Java 不使用命名空间,而是使用包来促进类的管理/关系。您可以从另一个包中导入类(第一种形式),或使用具有完整包名的类(第二种形式)。

    第一种形式的例子:

    package package1;
    
    public class Package1Class {
    }
    
    package package2;
    
    import package1.Package1Class;
    
    public class Package2Class {
        private Package1Class x;
    
        public Package2Class (Package1Class x) {
            this.x = x
        }
    }
    

    第二种形式的例子:

    package package1;
    
    public class Package1Class {
    }
    
    package package2;
    
    public class Package2Class {
        //look that there is not use of the import statement, however everytime you need
        //to call Package1Class, you should provide the full package name
        private package1.Package1Class x;
    
        public Package2Class (package1.Package1Class x) {
            this.x = x
        }
    }
    

    【讨论】:

      【解决方案3】:

      Java 中的规则是公共类名与 .java 文件名相同,与任何 IDE 无关。

      一个.java文件中可以有多个类,只要其中一个与公共类同名。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-29
        • 1970-01-01
        • 1970-01-01
        • 2014-11-02
        • 2015-06-22
        • 2021-07-22
        • 1970-01-01
        • 2011-06-12
        相关资源
        最近更新 更多