Изначально я пыталась реализовать решение так, как показано ниже. Но решение не проходило (после введения строки "helicopter" поток почему-то не закрывался, а ждал введения второй строки). Почему? P. S. В итоге я решила создать в статическом поле reset переменные String line (для вводимых строк) и int number (для количества пассажиров) и решала с их помощью.
public class Solution {
    public static void main(String[] args) {

    }

    static {
        reset();
    }

    public static CanFly result;

    public static void reset() {
        try {

            // сначала создаём поток чтения
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

            // а вот здесь я пытаюсь определить result в зависимости от введённой строки
            if (reader.readLine().equals("plane")) {
                result = new Plane(Integer.parseInt(reader.readLine()));
                reader.close();
            } else if (reader.readLine().equals("helicopter")) {
                result = new Helicopter();
                reader.close();
            }

        } catch (IOException e) {

        }
    }
}