Actually, most Java implementations do not make a binary executable. Not in the traditional sense.
Your computer doesn't know what this thing called "text" is. It doesn't understand C++ or BASIC or Fortran or any other programming language. All it understands is a sequence of numbers. Some numbers represent actions, like add or subtract or read. Others represent actual numbers. And other numbers are used to represent text. This is the ONLY language that your computer understands. With languages like C++, you run a program called a compiler that turns the source code into a series of instructions that the computer can understand.
With an interpreted language, like Bash or Perl, the program cannot be run directly by the computer. Instead, the user of the script needs another program, a real executable program on their machine. That program reads in the script and issues machine code instructions based on what it reads in the script.
With langauges like Java and the .NET languages (VB.NET, C#, F#, and so on), you have sort of a middle ground. There is a compiler that generates a binary code. But it isn't machine code- your computer doesn't understand it directly. There's still that interpreter like in the scripting languages, called a "Just In Time Compiler" here that turns the byte code into real machine code when it runs.
The other thing you need to keep in mind is that there are languages and there are language implementations. The Oracle version of Java for instance, generates that intermediate code. But there are other versions of Java (like a frontend to GCC) that do generate real machine code. And it's possible to have other Java implementations that interpret the Java program just like a scripting language. They're still all Java even though they work differently.