【问题标题】:No main method identified?没有确定主要方法?
【发布时间】:2020-06-14 07:52:04
【问题描述】:

这里对 java 来说真的很陌生。我正在尝试构建一个抽象类 Animals,并将其扩展到 Ducks 的子类。然后我将创建一个对象ducksworth,证明Duck 继承了超类动物的方法,并且可以调用对抽象类变量的引用。当我尝试在 Netbeans 中运行我的代码时,即使 AllAnimals 类包含一个主调用,它也找不到主方法调用。任何帮助,将不胜感激?此代码完全写在 Netbeans 中的单个文件中。

理想情况下,我想要的输出是“羽毛”

abstract class Animal {

String FUR= "fur";
String FEATHER = "feather";
String SCALE = "scale";
String SHELL = "shell";
String SKIN = "skin";

abstract String getCovering( );
abstract void makeSound();
abstract boolean canFly( );

}

class Duck extends Animal {
    String covering  = FEATHER;
    String sound = "quack";
    boolean flight = true;
    String getCovering() {
        System.out.println("Ducks are covered in " + covering);
        return covering;
    }
    void makeSound() { 
        System.out.println(sound);
    }
    boolean canFly() { 
        return flight; 
    }
}

class allanimals {
    public static void main(String[] args) {
        Duck ducksworth = new Duck();
        ducksworth.getCovering();
    }
}

【问题讨论】:

  • 你用什么命名你的文件并公开 allanimals 类。将文件命名为相同的 allanimals。还有一点约定,以第一个字母为大写命名您的类。
  • “当我尝试在 Netbeans 中运行我的代码时,它无法找到 main 方法调用”我们可以看看你是如何尝试运行你的项目的,它的结构是什么?
  • 你的文件名应该是'allanimals.java'

标签: java inheritance extends


【解决方案1】:

文件中至少有一个类应该是公共的,在这种情况下,最好将该文件添加到 allanimals.java 并且必须将此类标记为公共类。

【讨论】:

  • 不要求 .java 文件中至少有一个类需要公开。
  • 编译器强制要求:如果我们在源 .java 文件中声明顶级公共类,则该类需要与源文件名具有相同的名称,这意味着如果我们在Foo.java 中写入public class ...{..},那么它的唯一有效名称是public class Foo {..}。但这并不意味着Foo 类必须是public。我们也可以在Foo.java 中添加class Foo{..}main 方法也没有要求只能放在 public 类中。
【解决方案2】:

正如大家所说。将实际课程放在下面。

所做的更改:

  1. 类名 allanimals 更改为 AllAnimals 以获得更好的标准。
  2. 类 AllAnimals 被公开以供 jvm 访问静态 main 方法。
  3. 文件名作为公共类名 - AllAnimals.java

文件名:AllAnimals.java

abstract class Animal {

String FUR= "fur";
String FEATHER = "feather";
String SCALE = "scale";
String SHELL = "shell";
String SKIN = "skin";

abstract String getCovering( );
abstract void makeSound();
abstract boolean canFly( );

}

class Duck extends Animal {
    String covering  = FEATHER;
    String sound = "quack";
    boolean flight = true;
    String getCovering() {
        System.out.println("Ducks are covered in " + covering);
        return covering;
    }
    void makeSound() { 
        System.out.println(sound);
    }
    boolean canFly() { 
        return flight; 
    }
}

public class AllAnimals {
    public static void main(String[] args) {
        Duck ducksworth = new Duck();
        ducksworth.getCovering();
    }
}

【讨论】:

  • 你能解释一下你的答案吗?你做了哪些改变以及为什么(OP 面临什么问题以及为什么这些改变可以解决它)?
  • 点 (2) 看起来不正确,因为非公共类型(类、接口、枚举)也可以包含 main 方法,因此 JVM 不会使用该信息来确定其位置。
【解决方案3】:

你是如何运行这个项目的?

将每个类都放在一个文件中是最简单的,这样您就可以使用 main https://www.protechtraining.com/content/java_fundamentals_tutorial-hello_world 简单地编译和运行该类

或者,看看这里: Java: Multiple class declarations in one file

https://www.quora.com/Can-we-keep-more-than-one-class-in-a-single-java-file

【讨论】:

    【解决方案4】:

    这不是我推荐的 JDK 8 习惯用法。首选接口而不是抽象类。在适当的地方添加默认方法。

    我们什么时候会看到 Animal 的结尾作为首选继承示例?显然不是今天。

    我可以这样做:

    public interface Animal {
        String getCovering();
        void makeSound();
        boolean canFly();
    }
    
    
    public class Duck implements Animal {    
        public String getCovering() { return "feathers"; }
        public void makeSound() { return "quack"; }
        boolean canFly() { return true; } 
    }
    

    现在了解JUnit还为时过早:

    public class AnimalTest {
    
        @Test
        public void testList() {
            // setup
            List<Animal> animals = Collections.singletonList(new Duck());
            List<String> expectedCoverings = Collections.singletonList("feathers");
            List<String> expectedSounds = Collections.singletonList("quack");
            List<Boolean> expectedFly = Collections.singletonList(Boolean.TRUE);
            // exercise
            // assert
            for (int i = 0; i < animals.size(); ++i) {
                Assert.assertEquals(expectedCovering.get(i), animals.get(i).getCovering());
                Assert.assertEquals(expectedSound.get(i), animals.get(i).makeSound());
                Assert.assertEquals(expectedFly.get(i), animals.get(i).canFly());
            }
        }
    }
    

    随着您添加更多 Animal 实现,测试很容易扩展。

    【讨论】:

      猜你喜欢
      • 2021-07-14
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 2013-11-23
      • 2017-09-07
      • 2019-02-01
      相关资源
      最近更新 更多