1) А) Почему обязательно вызывать конструктор класса-родителя в данном случае (строка 37)?
Б) Могут ли вообще конструкторы класса-родителя и класса-наследника отличаться?
В) Super инициализирует переданным значением 1) только переменную name класса Thread, 2) только переменную name класса PrintListThread или 3) переменную name класса Thread и переменную name класса PrintListThread?
2) где берется и у чего вызывается метод getName() в строке 41? По логике у класса Thread есть переменная name, которую наследует PrintListThread, и метод getName, который ее возвращает, причём getName вызывается неявно у текущего объекта (this). Попробовал вместо вызова super(name) написать this.name = name; написало, что переменная name приватная. Соответственно, в классе PrintListThread у меня нет к ней доступа, этот момент с наследованием приватных штук ещё не совсем догоняю. А если инициализируется переменная name сласса Thread, а затем она вызывается в getName у PrintListThread , то мне совсем ничего не понятно)
package com.javarush.task.task16.task1606;
import java.util.ArrayList;
import java.util.List;
/*
join: в нужное время в нужном месте
*/
public class Solution {
public static void main(String[] args) throws InterruptedException {
PrintListThread firstThread = new PrintListThread("firstThread");
PrintListThread secondThread = new PrintListThread("secondThread");
firstThread.start();
firstThread.join();
secondThread.start();
}
public static void printList(List<String> list, String threadName) {
for (String item : list) {
System.out.println(String.format("%s : %s", threadName, item));
}
}
public static List<String> getList(int n) {
List<String> result = new ArrayList<String>();
if (n < 1) return result;
for (int i = 0; i < n; i++) {
result.add(String.format("String %d", (i + 1)));
}
return result;
}
public static class PrintListThread extends Thread {
public PrintListThread(String name) {
super(name);
}
public void run() {
printList(getList(20), getName());
}
}
}