Good day.
There is an example from the chapter Interfaces - Interfaces as a means of adaptation:

//: interfaces/RandomWords.java // Реализация интерфейса для выполнения требований метода import java.nio.*; import java.util.*; public class RandomWords implements Readable { private static Random rand = new Random(47); private static final char[] capitals = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); private static final char[] lowers = "abcdefghijklmnopqrstuvwxyz".toCharArray(); private static final char[] vowels = "aeiou".toCharArray(); private int count; public RandomWords(int count) { this.count = count; } public int read(CharBuffer cb) { if(count-- == 0) return -1; // Признак конца входных данных cb.append(capitals[rand.nextInt(capitals.length)]); for(int i = 0; i < 4; i++) { cb.append(vowels[rand.nextInt(vowels.length)]); cb.append(lowers[rand.nextInt(lowers.length)]); } cb.append(" "); return 10; // Количество присоединенных символов } public static void main(String[] args) { Scanner s = new Scanner(new RandomWords(10)); while(s.hasNext()) System.out.println(s.next()); } } 

I can not understand why the read method runs, although it is not called anywhere.

The algorithm, as I understand it, is as follows:
A link to the Scanner object is created, a Scanner object is created, and a RandomWords object is created and passed to the constructor. Further, the magic for me is caused by the hasNext () of the Scanner object and it is not clear what happens next.
I worked with Scanner when an input or file was later transferred to the constructor. And there it was clear that this would be the following value. And further reading.
What happens in this case, can someone explain? I just don’t understand how it works and why the read method is called.

    1 answer 1

    In your case, it would help a lot to debug the source code for the Scanner class (the JDK always comes with the source of all the classes from the standard library, they are in the src.zip archive in the JDK folder). There you would see that in the hasNext() method of the Scanner class, the same method calls the read() method of the RandomWords class, the instance of which you passed to the Scanner at creation. Similarly, the read() method of the RandomWords class is RandomWords called when calling the next() method of the Scanner class.

    By RandomWords class to the Scanner class constructor that implements the Readable interface (in your case, an instance of RandomWords class), you give Scanner 'a source, from which it will read data by calling the read() method of this class. According to the documentation, such a class should, when calling the read() method, write the read data to the transferred CharBuffer and return either the number of bytes read or -1 if nothing was read (end of input).