【问题标题】:Java exercise files without main?没有main的Java练习文件?
【发布时间】:2015-04-30 02:17:40
【问题描述】:

一直在阅读 Core Java Fundamentals (Horstmann/Cornell) 第 9 版,但在第 5 章左右之后的某个时间,练习文件和示例代码都不再具有“main”方法,但本书的行为就像它们应该编译和运行一样,等等……

非常困惑,因为 java 应用程序需要一个 main 来运行。任何熟悉这些文本的人都可以为我提供一些启示。现在感觉很愚蠢:)

【问题讨论】:

  • 也许作者已经决定,当你读到第 5 章时,你已经认识到 main 方法的必要性,并且他们不会费心为每个示例重复相同的样板代码?跨度>
  • 我假设练习文件是可编译的,但他们没有提到添加样板代码以使其运行。我以为我错过了一些关于包的概念(即,也许我应该运行其他东西来访问这些包组件等......)
  • 任何合理有用的应用程序都有不止一个类。你真的应该只有一个主要方法驻留在这些类之一中。您确实需要至少一种主要方法来运行应用程序并调用不同的类来完成应用程序的目的。但除此之外,您的类不需要使用 main 方法。

标签: java main


【解决方案1】:

许多库的开发目的并非作为独立应用程序运行。 Joda-Time 就是这样一个例子。它是一个可用于简化日期和时间数据操作的库。不可否认,我链接的源代码库中确实包含主要方法,但那是因为它们在其单元测试中使用。

Core Java Fundamentals 第五章的重点是介绍类继承,这样 Vehicle 可以是 Boat 的超类,可以是 Sailboat 的超类,可以是 Sunfish 的超类。这本书可能有一个像 Person > Employee > Manager 这样的例子,最终在同一章你可能会看到像 TestManager 这样的测试类,它实际上有一个使用 Manager 的 main 方法。

假设我写了一本类似的书,并展示了 Person 示例的简化版本。我在 Eclipse 中创建了一个项目,我称之为 Personnel。我添加了一个包 org.company,并在该包中添加了这 3 个类:

人物

package org.company;
public class Person {
    public String name;
    public Person() {

    }
}

员工

package org.company;
public class Employee extends Person {
    public String employeeID;
    public Employee() {

    }
}

经理

package org.company;
import java.util.ArrayList;
import java.util.List;
public class Manager extends Employee {
    public List<Employee> subordinates ;
    public Manager() {
        subordinates = new ArrayList<Employee>();
    }
}

我现在可以假设您可以创建自己的项目并合并我编写的这些类。我命名我的人员这一事实是无关紧要的。调用你的 MyTest1,然后甚至不用费心创建一个包,并添加一个名为 TestManager 的类。只要您 A) 将我的类放在您的项目 org/company/Person、Employee、Manager 或 B) 中的两个文件夹中,从每个文件夹中删除 package org.company 并将它们包含在您的新 TestManager 类旁边,那么您应该能够在您的测试中将它们实例化为:

测试管理器

import org.company.Employee;
import org.company.Manager;
public class TestManager {
    public static void main(String[] args) {
        Employee bill = new Employee();
        bill.name = "Bill";
        bill.employeeID = "1";

        Employee george = new Employee();
        george.name = "George";
        george.employeeID = "3";

        Manager jill = new Manager();
        jill.name = "Jill";
        jill.employeeID = "1234";
        jill.subordinates.add(bill);
        jill.subordinates.add(george);

        //foreach
        for (Employee emp : jill.subordinates) {
            System.out.println(emp.name);
        }
    }
}

Eclipse 中的文件现在看起来像这样。

您需要考虑的未来任务是从 Internet 获取一个库,例如 Joda-Time,并通过将其添加到构建路径来了解如何将其整合到您的项目中。

【讨论】:

  • 这很有帮助,但是当我尝试编译“测试”文件时,我会生成一个与未找到包中的其他文件相关的错误。我尝试使用导出设置我的类路径以包含“。”但包中的其他文件仍然无法编译或被发现等...
  • @JamesLingo 我的编辑很广泛。它可能会对您的情况有所帮助。如果您有任何问题,请告诉我。
  • 现在开始解决这个问题,但我一直在没有 IDE 的情况下工作(从命令行使用 pico 编辑器),所以这可能只是我的问题的一部分。非常感谢您如此彻底,将开始在 Eclipse 中工作并让 IDE 帮助我管理所有文件 :)
  • 为了确认一下,作者开始在一个简单的命令行编辑器中进行编码,但假设读者在引入软件包后已切换到 IDE。从 Eclipse 内部运行效果很好,虽然我仍然不确定我的 CLASSPATH 变量出了什么问题,哈哈 :)。
【解决方案2】:

类会在没有主函数的情况下编译,但是当你想执行同一个类时问题就来了。

例如: A类,B类和B类有方法但没有main方法,那么你可以在没有main方法的情况下调用程序。 JVM 需要一个点火点来告知从哪里开始。对于同一个例子,如果 A 类有 main 方法,而其他没有。 B类和C类的方法可以从A类调用,因为JVM从A开始,执行其他类方法没有问题。

【讨论】:

    猜你喜欢
    • 2010-11-06
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2017-06-16
    • 1970-01-01
    相关资源
    最近更新 更多