Study of the System.in.read() method inside a Do-While loop
It will basically run as long as the conditions are true but without asking for another input (of course, since it's a do while loop, the first time when ran, it will not evaluate any condition for the Do part to be ran). It will run without asking for another input as long as all the ASCII values were attributed to the choice variable.
The enter key which has the ASCII value of 10 is also taken into account, it's the final character when inputting.
Example: the value 50. So if while(choice > 10), it will stop running. But if while(choice < 1 || choice > 4), it's going to ask for another input since choice > 4.
Similarly, when inputting 1 and converting it to char and assigning to choice (which is char this time), it's going to check for while(choice <= '1' || choice > '4'), and so choice == 1, therefore, it's going to run another time doesnt asking for input and instead printing out the '\n' new line character because of the ASCII value for the enter key. This time, the loop will go back to running because while(choice <= '1' || choice > '4'), therefore choice (which is 10) < '1' (which is 49) will evaluate to true, and so will ask for another input.
I'm afraid it would have the same behaviour on the other types of loops, but I'm not sure since I haven't tested it out yet.