Basicly they read the code while the program is running, opposite of running a compiler which compiles the code.
A compiler takes code in one language and translates it to code in another language, usually more machine friendly than the original. An interpreter enables the execution of code on hardware lacking native support for that language. To emphasize the difference, a compiler can only translate code where as an interpreter can only run code. Many interpreters make use of a compiler internally for performance.
Java and Python reads the code while it runs, meanwhile C# or C++ compiles it.
Java and Python pre-compile the human friendly code into more machine friendly java/python bytecode. This bytecode can then be interpreted by the java/python virtual machine. The java/python virtual machine might just in time compile the java/python bytecode into more efficient native machine code which does not need an interpreter to run.
Most C# implementations work the same as java/python from what I can tell. They produce C# bytecode (cli code?) which is then interpreted by the .NET system. In theory C# could use a compiler to translate into machine code however I am not aware of any such implementations and generally they would be counter productive to the aims and goals of the C# language.
C and C++ are languages that are generally compiled with a compiler into a packed machine code format intended for native execution on hardware.
However things are not that simple. There do exist C and C++ code interpreters used to evaluate single statements, such as for command line use. There also do exist Java hardware processors which have java bytecode as an instruction set so have no need of Java interpreters or just in time compilers. There also exist software emulators with an interpreter that can take packed machine code from a compiler and run it. You also get compilers which take one human friendly language and turn it into another, such as vJASS compiling into JASS and the original C++ (not modern versions) compiling into C.
Then you get hardware itself... Modern x86 processors have sort of a hardware interpreter (if you can call it that) for some x86 instructions (which come from x86 machine code). It is configured using microcode and translates the instruction into physical execution logic. The reason this exists is to make the processor mechanics more RISC like as opposed to the CISC nature of x86.
Oh, Python interpreter takes user-written input? I don't actually want that.
Python is designed to be more flexible than Java. Where as Java still has the traditional program->compile->distribute work flow, Python does not need that and instead you can distribute source code files directly. The language treats both source code and byte code files very similarly to the point that the difference is transparent. Often when a Python program is run a bunch of compiled python bytecode files will appear as the interpreter itself prefers to run python bytecode due to improved performance and easier design.
Do note that the Python interpreter is not the reason the language is so slow compared with Java and C++. Python is slow because of the memory model it uses, where named elements are stored in a hierarchy of mapping objects (dictionaries I recall, been a long time so might not be right). In order to implement this memory model on most computer architectures, every time such a named element is used the interpreter has to resolve it to data in physical memory using mapping data structures such as hashtables which have significant overhead. This is also the reason why JASS is so slow in Warcraft III as the JASS bytecode interpreter does something very similar, although probably less efficiently. Java and C/C++ use a memory model that is more efficient on most architectures as it is generally lower level and more directly compatible.
So there'd be compiler and interpreter.
It is often needed for the interpreters to have viable realtime performance. It also can allow for a more modular design as the pre-compiler component and language specific bytecode interpreter can be written separately. One can also add support for reading the intermediate bytecode format from a file directly brining better code loading performance as well as smaller distributable size.
A lot of modern interpreters work by taking non-native code and using a compiler to convert it into native machine code in a process called just in time compiling. This is best seen in Java which is how it can achieve performance similar to C/C++ for a lot of tasks. The most practical example would be in modern emulators like Dolphin (gamecube/wii), and the semi-functional PS3, Xbox 360 and Wii U emulators where without JIT compiling getting real time performance from the interpreters is near impossible.