Помогите понять и с ошибками
Извините что тупой. Во-первых помогите понять. Кучу встречал вариаций: метод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 шт):
Так будет работать. Да, в Вашем коде обращение к классам, а не созданным объектам этих классов. Нельзя просто так взять и присвоить ссылке типа 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;
}
}