풀랫폼 독립성
자바는 하드웨어, 운영체제 등 플랫폼에 종속되지 않는 독립적인 바이트 코드로 컴파일되며 자바 가상 머신만 있으면 프로그램의 실행이 가능하다.
객체지향
자바는 객체지향 언어로, 캡슐화와 상속 그리고 다형성을 지원한다.
클래스 캡슐화
자바는 객체지향 언어의 캡슐화 원칙을 철저히 지켜, 변수나 메소드는 반드시 클래스 내에 구현하도록 한다. 클래스에 속하지 않은 변수나 메소드는 있을 수 없고, 클래스 안에 새로운 클래스, 즉 내부 클래스를 만들 수 있다.
소스와 클래스 파일
클래스 파일(.class)에는 반드시 하나의 자바 클래스만 들어 있다. 하나의 자바 소스 파일에 여러 개의 클래스를 작성한 경우, 컴파일하면 클래스마다 별도의 클래스 파일이 생성된다.
실행 코드 배포
자바 프로그램은 한 개의 클래스 파일 또는 다수의 클래스 파일로 구성된다. 다수의 클래스 파일을 압축(.jar)하여 배포하거나 실행할 수 있다. 자바의 실행은 main() 메소드에서 시작되며, 하나의 클래스 파일에 두 개 이상의 main() 메소드가 있을 수 없다.
패키지
서로 관련 있는 클래스는 패키지로 묶어 관리한다. 패키지는 파일 시스템의 폴더와 같으느 개념이다. 예를 들어 java.lang.System 클래스는 java\lang 폴더의 System.class 파일을 나타내며, java.lang을 패키지라고 부른다.
멀티 스레드
하나의 자바 프로그램이 다수의 작업을 처리할 수 있도록 다수의 스레드가 동시에 실행할 수 있는 환경을 지원한다. 자바는 운영체제의 도움 없이 멀티 스레드 프로그래밍이 가능하기 때문에, 멀티 스레드를 지원하지 않는 운영체제에서도 자바를 이용하면 멀티 스레드 프로그램을 개발할 수 있다.
가비지 컬렉션
자바 언어는 메모리 할당 기능은 있지만, 메모리 반환 가능은 없다. 프로그램 내에 사용되지 않는 메모리는 자바 가상 기계의 [가비지 컬렉션][3] 기능에 의해 자동으로 회수된다.
실시간 응용 시스템 부적합
실행 도중 예측할 수 없는 시점에 가비지 컬렉션이 실행되므로 프로그램 실행이 일시적으로 중단된다. 데드라인 내에 반드시 실행 결과를 가져와야하는 실시간 시스템에는 자바 언어가 적합하지 않다.
안전성
자바는 타입 체크가 엄격하며, C와 C++과는 달리 메모리의 물리적 주소를 사용하는 포인터의 개념이 없어, 잘못된 자바 프로그램으로인해 컴퓨터 시스템이 중단되는 일이 없다.