Utworzyłeś instacje klasy String . a następnie przepisałeś mu konstruktor Scanner i wyłowałeś metodę nextLine . Ok, to działa, ale zauważ jedną rzecz, jeżeli spróbujesz wyłować w imie.nextInt() np: wyrzuci Ci błąd, gdyż imię jest String. Inaczej rzecz ujmując, dojdzie do błędnej konwersji danych i ta zmienna będzie mogła przejmować tylko String. Owszem, możesz stworzyć kolejnego scannera. Jednakże, jeżeli będziesz wywoływał kolejne Scannery to zajmowany obszar pamięci będzie coraz większy (Owszem, garbage_colector sobie jakoś poradzi, ale po co wywoływać go bez sensu jak można uniknąć tą usterkę).
Poprawniej powinno być
Scanner input = new Scaner(System.in);
int x = Scanner.nextInt();
String imie = Scanner.nextLine();
input.close();
Tym sposobem, uruchomiłem tylko raz Scanner i odwołuje się do jego metod. Przez co mniej pamięci zje.
Zauważ kolejną rzecz:
String imie = new Scanner(System.in).nextLine();
imie.close(); // Tu będzie błąd.
Dlaczego? Linijke wcześniej , zrobiłeś tzw. jawne wyłowanie konstruktora i metody. I zostało to przepisane do obiektu imię o klasie String, ale... metoda close już nie. Przez co JAVA rzuci wyjątek, dude ten obiekt nie ma takiej metody. Po drugie , jeżeli wywołujemy w ten sposób:
int C = UtworzonaKlasa.getC();
To spodziewamy, się , że obiekt UtworzonaKlasa o klasie UtworzonaKlasa , pobierze z prywatnego pola o nazwie C i o typie int.
A co ma zwracać metoda close ??
imie = new Scanner(System.in).close(); // Tu również będzie błąd.
Dlaczego? Bo close i jest void. A JAVA spodziewa się, że metoda close zwróci nam jakiś String.
To dlaczego to jest poprawny zapis?
Scanner input = new Scanner(System.in);
input.close();
Ten obiekt nazywa się input o typie Scanner , którego konstruktorem jest Scanner. Mówiąc inaczej, kazaliśmy JAVIE. Utwórz mi obiekt Input o klasie Scanner i przepisz mu wszystkie metody i pola , konstruowane przez Scannera. Dlatego teraz mogę, zamknąć Scannera. Bo JAVA wie, że ma patrzeć na obszar pamieći w której jest Scanner i znależć tam metodę close.