A high-level programming language is one that lets you design your solution in a way that represents the real-world problem as closely as possible. Assembly is low-level because its code does not resemble the real-world problem at all, and is rather just a long list of instructions.

An Object Oriented language, however, has high-level features because it allows you to design your program in a way resembling the problem - you can define code that represents the elements and objects involved in your problem. This is called providing layers of abstraction, or abstraction mechanisms.

High-level languages are not always as efficient as the more direct Assembly language, but this depends mostly on the compiler, optimizer and language design. High-level languages lack efficiency because they achieve things in a more roundabout way - the abstraction mechanisms often have overheads in terms of efficiency.