Попытаюсь объяснить лекцию про ввод данных. Многим остались непонятны описанные там куски кода. Я тоже новичок, два дня разбирался, вроде бы получилось и вот хочу донести таким же новичкам, чтобы не тратили столько времени. В лекции приведен пример кода:
InputStream inputStream = System.in;
Reader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

String name = bufferedReader.readLine(); //читаем строку с клавиатуры
String sAge = bufferedReader.readLine(); //читаем строку с клавиатуры
int nAge = Integer.parseInt(sAge); //преобразовываем строку в число.
Первая строка:
InputStream inputStream = System.in;
Тут ни к чему. Она просто показывает, что статическая (значит, что ее нельзя изменить) переменная in класса System наследует методы абстрактного ( это значит, что класс сделан только для описания чего-то, но он не имеет конструктора для создания новых объектов). Т.е. он имеет методы и поля для описания какого то объекта) класса InputStream. Это все значит, что переменная in описана в классе System, но наследует методы класса InputStream. И так. Т.е. ввод данных можно написать таким образом (просто без первой строки):
Reader inputStreamReader = new InputStreamReader(System.in);
       BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

       String name = bufferedReader.readLine();
       System.out.println(name);
Классы BufferedReader, InputStreamReader являются наследниками класса Reader, который в общем случае предназначен для чтения данных. System.in - переменная, которая считывает поток байтов с клавиатуры. Каждый символ, вводимый на клавиатуре, представлен байтами. Т.е. допустим символ А кириллицы кодируется числом 175 в десятичной системе исчисления. Но мы то не умеет читать по цифрам. Тут нам в помощь приходит класс InputStreamReader, который создан для того, чтобы преобразовывать такие числа в символы. Это происходит в правой части этой строки, где мы создаем объект этого класса и заносим туда данные из переменной System.in
Reader inputStreamReader = new InputStreamReader(System.in);
В итоге это выражение объекту inputStreamReader класса Reader передает ссылку на объект класса InputStreamReader, где наши байты уже преобразовались в символы. Делаем мы это для того, чтобы передать это все объекту класса BufferReader, который умеет считывать символы из потока ввода:
BufferedReader bufferedReader = new BufferedReader(System.im);
И далее:
String name = bufferedReader.readLine();
Здесь мы как раз применяем умение объекта bufferedReader класса BufferReader считывать символы из строки и далее присваеваем их переменной name. P.s. Исправьте, пожалуйста, если нашли ошибку в разъяснениях.