Помогите понять и с ошибками

Извините что тупой. Во-первых помогите понять. Кучу встречал вариаций: метод1().метод2 метод1(метод2) метод1.метод2() Где про это прочитать? Шилдта вроде читал, не помогло. Устал исправлять ошибки вслепую,перебором, заместо понимания причины ошибок.

Во-вторых. Задача: компания проводит интервью с кандидатами на позицию разработчика. В списке интервьюируемых есть кандидаты подготовленные по спец.программе и самостоятельно готовившиеся. На интервью работник приветствует каждого соискателя "спефраза работника" кандидат отвечает "мое имя name" и описывает свой опыт в java в двух вариантах: "я готовился по спец.рограмме" " я готовился сам"

Код:

import java.util.ArrayList;

public class pitayus_ustroitsya_Junom_A_mne_36 {
    public static void main(String[] args) {
        String crew = new Employer();
        ArrayList<Candidate> candidates = new ArrayList<>();
        candidates.add(new Candidate("Vasya", "self-learner"));
        candidates.add(new Candidate("Petya", "getJavaCourses"));
        candidates.add(new Candidate("Slim Shady", "self-learner"));
        for (Candidate candidate : candidates) {
            Employer.hello();
            Candidate.hello();
            Candidate.describeExp();
        }
    }
}

class Candidate {
    String name;
    String exp;         //переменная опыта соискателя. всего 2 варианта.

    public candidate(String name, String exp) {
        this.name = name;
        this.exp = exp;
    }

    public void hello() {
        System.out.println("Hi, my name is " + name);
    }

    public void describeExp() {
        if (exp == "self-learner") {
            System.out.println("фраза 1 " );
        } else System.out.println("фраза 2");
    }
}

class Employer {
    public void hello() {
        System.out.println("Hi! Introduce yourself");
    }
}

Такое еще: Abstract class must contain implementation


Ответы (2 шт):

Автор решения: OlegFrolOff

Так будет работать. Да, в Вашем коде обращение к классам, а не созданным объектам этих классов. Нельзя просто так взять и присвоить ссылке типа String объект типа Employer. Не нужно сравнивать ссылочные типы, такие как String, с помощью оператора ==.

import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String[] args) {
        Employer employer = new Employer();
        List<Candidate> candidates = new ArrayList<>();
        candidates.add(new Candidate("Vasya", "self-learner"));
        candidates.add(new Candidate("Petya", "getJavaCourses"));
        candidates.add(new Candidate("Slim Shady", "self-learner"));
        candidates.forEach(candidate -> {
            employer.hello();
            candidate.hello();
            candidate.describeExp();
        });
    }
}

class Candidate {

    String name;
    String exp;         //переменная опыта соискателя. всего 2 варианта.

    public Candidate(String name, String exp) {
        this.name = name;
        this.exp = exp;
    }

    public void hello() {
        System.out.println("Hi, my name is " + name);
    }

    public void describeExp() {
        if (exp.equals("self-learner")) { //не стоит сравнивать строки с помощью ==
            System.out.println("фраза 1 ");
        } else {
            System.out.println("фраза 2");
        }
    }
}

class Employer {
    public void hello() {
        System.out.println("Hi! Introduce yourself");
    }
}
→ Ссылка
Автор решения: Дмитрий

Попробую расписать подробнее, так должно быть понятнее...

import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

public class pitayus_ustroitsya_Junom_A_mne_36 {

    public static void main(String[] args) {

        //Коллекция типизирована интерфейсом Supplier, который имплементируется классами Candidate и Employer
        //данный интерфейс имет один метод get(), его нужно имплеиентировать классам-наследникам
        //именно с помощью этого метода будет формарировать сообщение кандидата либо работника
        //вместо Supplier можно реализовать свой интерфейс, это не имеет значения для функуионала
        List<Supplier<String>> list = new ArrayList<>();
        //поскольку наша коллекция теперь типизирована интерфейсом Supplier, а классы Candidate, Employer его имплементируют
        //мы можем добавит в коллекцию и кандидатов и работников
        list.add(new Employer("Hi! Introduce yourself"));
        list.add(new Candidate("Vasya", "self-learner"));
        list.add(new Candidate("Petya", "getJavaCourses"));
        list.add(new Candidate("Slim Shady", "self-learner"));

        //перебираем в цикле все элементы. коллекция типизирована интерфейсом Supplier.
        //на данном этапе мы не знаем, кто именно (работник или кандидат) скрыт а каждом элементе коллекции
        //теперь нам доступен только один метод интерфейса Supplier - метод get()
        //вместе с тем, метод get() будет выполняться по разному для кандидатов и работников
        //это происходит потому, что этот метод по разному переопределен для Candidate и Employer
        //для Candidate выводится имя и тип обучения, а для Employer выводится только одна фраза с приветствием
        //это и называется полиморфизм
        for (Supplier <String> person : list) {
            //вызов метода get() у каждого элемента коллекции позволяет получить сообщение работника либо кандидата
            //интерфейс Supplier типизирован String, поэтову возвращаемое значение для метода get() - String
            String message = person.get();
            //выводим в консоль полученное в результате вызова метода get() сообщение
            System.out.println(message);
        } 

    }

}

//имплементируем интерфейс Supplier типизируем его String.
//String для типизации выбран потому, что мы хотим выводит сообщения, а сообщения хранятся в переменной String
class Candidate implements Supplier<String>{

    private final String name;
    private final String experience; 

    public Candidate(String name, String experience) {
        this.name = name;
        this.experience = experience;
    }
    //после имплементации интерфейса Supplier мы обязаны переопределить его метод get()
    //поскольку интерфейс Supplier мы типизировали String, наш метод вернет String
    @Override
    public String get() {
        return name + "\n" + experience;
    }

}

class Employer implements Supplier<String>{

    private final String message;

    public Employer(String message) {
        this.message = message;
    }

    @Override
    public String get() {
        return message;
    }

}
→ Ссылка