Основной метод не определен? - PullRequest
0 голосов
/ 02 марта 2020

Действительно новый для java здесь. Я пытаюсь построить абстрактный класс Animals, расширяя его до подкласса Ducks. Затем я создам объект Ducksworth, который доказывает, что Duck унаследовал методы от животных суперкласса, и может вызывать ссылки на переменные абстрактного класса. Когда я пытаюсь запустить свой код в Netbeans, он не может найти вызов метода main, хотя класс 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();
    }
}

Ответы [ 4 ]

1 голос
/ 02 марта 2020

Как все говорили. Помещение фактического класса ниже.

Произведенные изменения:

  1. Все имена классов заменены на AllAnimals для лучшего стандарта.
  2. Класс AllAnimals сделан публично c для jvm для доступа к stati c основной метод.
  3. Имя файла задано как publi c Имя класса - 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();
    }
}

0 голосов
/ 02 марта 2020

Это не та идиома JDK 8, которую я бы рекомендовал. Предпочитаю интерфейс абстрактному классу. При необходимости добавьте методы по умолчанию.

Когда мы увидим конец Animal в качестве примера go к наследованию? Видимо, не сегодня.

Вот как я могу это сделать:

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 реализаций.

0 голосов
/ 02 марта 2020

Как вы работаете над проектом?

Проще всего иметь каждый класс в файле, чтобы вы могли просто скомпилировать и запустить класс с вашим main https://www.protechtraining.com/content/java_fundamentals_tutorial-hello_world

В качестве альтернативы, посмотрите здесь : Java: несколько объявлений классов в одном файле

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

0 голосов
/ 02 марта 2020

По крайней мере один класс в файле должен быть общедоступным c, в этом случае предпочтительнее, чтобы файл получал галлины всех животных. java и этот класс должен быть помечен как общедоступный c один.

...