DrJava 告诉我没有 main,但 main 是在 class 声明中定义的

DrJava tells me there's no main, but main is defined within the class declaration

我正在尝试使用 DrJava 学习 Java。

当我尝试 运行 这段代码时,DrJava 告诉我:

Static Error: This class does not have a static void main method accepting String[].

我不明白为什么 DrJava 告诉我没有主电源。这是 class canine 声明之后的第一行;而且我没有看到任何拼写错误或缺少标点符号。

我尝试用谷歌搜索这个,但我不明白什么 they were talking about

如果有人能以一种实际上并没有给我答案,而是让我自己弄清楚为什么会发生在我身上的方式告诉我,那就太好了——但如果问题太严重基本创造一个学习机会,然后我会采取解决方案;我猜。

/*
 * This is an exercise designed to practice creating a class Animal
 * And then creating another class canine in which to create an object dog.
 * The reason I want to call from one class to another is because I want 
 * to understand how classes, objects, inheritance, etc. works. 
 * Clearly, class canine is -in my mind at least, a child of class Animal.
 * The main method of canine then calls method attributes I think are being
 * inherited by dog and wolf,from the class Animal.    
 */

public class Animal {
  void growl() {
    System.out.println("Grrr");
  }
  void bark() {
    System.out.println("Arf! Arf!");
  }
}

class canine {
  public static void main(String[]args) {
    Animal dog = new Animal();
    dog.bark();

    Animal wolf = new Animal();
    wolf.growl();

  }
}

代码 运行 使用 java 命令行工具就可以了:java canine

当您执行 java canine 时,您将告诉 java 工具查找并加载 canine class 和 运行 它的 main方法。

如果您使用的是 java Animal,问题是 Animal 没有 maincanine 确实如此。

Clearly, class canine is -in my mind at least, a child of class Animal

不,除了 canine 在其 main 中使用 Animal 之外,canineAnimal 之间没有任何关系。例如,canine 依赖于 Animal 上,但与它没有其他关系。如果你想让它成为一个 subclass("child class" 的一个相当合理的解释),你可以在它的声明中添加 extends Animal。如果你想让它成为 nested class("child class" 的另一个相当合理的解释),你可以把它放在 inside Animal.

来自您的评论:

But I still don't understand why DrJava is telling me that it doesn't have a static void main method accepting String[]. Also, It's not printing anything, when I run on DrJava.

我想你把 canineAnimal 放在同一个文件中,使 Animal public,然后期待你混淆了 DrJava DrJava 弄清楚它应该 运行 canine.main 而不是 Animal.main。请参阅下面有关最佳做法的说明。

来自另一条评论:

but doesn't dog.bark() directly call the function in Animal? Why do I need to "extend" in this scenario?

你不知道。 class 可以使用另一个 class 而它们之间没有任何继承关系,就像您的代码那样。您在评论中使用了术语 "child class",表明您打算继承或类似。


旁注:虽然您不必遵循它们,但遵循标准 Java 命名约定是一种很好的做法。 Class 名称应以首字母大写和驼峰式命名。所以 Canine 而不是 canine.

旁注 2:与 一样,最好将每个 class 放在自己的 .java 文件中,并以 class 的名称命名。从技术上讲,您可以将非 public class 放在任何 .java 文件中(这就是该代码在 Animal.java 中使用 canine 的原因),但一般来说,同样,最佳做法是将它们分开。所以你会有 Animal.java 包含 Animal class,canine.java 包含 canine class(或者更好,Canine.java包含 Canine class).