
Mục Lục
Tổng quan về ngôn ngữ lập trình java
Java là một trong những ngôn ngữ lập trình hướng đối tượng. Nó được sử dụng trong phát triển phần mềm, trang web, game hay ứng dụng trên các thiết bị di động.
Java được khởi đầu bởi James Gosling và bạn đồng nghiệp ở Sun MicroSystem năm 1991. Ban đầu Java được tạo ra nhằm mục đích viết phần mềm cho các sản phẩm gia dụng, và có tên là Oak.
Java được phát hành năm 1994, đến năm 2010 được Oracle mua lại từ Sun MicroSystem.
Java được tạo ra với tiêu chí “Viết (code) một lần, thực thi khắp nơi” (Write Once, Run Anywhere – WORA). Chương trình phần mềm viết bằng Java có thể chạy trên mọi nền tảng (platform) khác nhau thông qua một môi trường thực thi với điều kiện có môi trường thực thi thích hợp hỗ trợ nền tảng đó.
Đặc điểm của ngôn ngữ lập trình Java
Tương tự C++, hướng đối tượng hoàn toàn
Trong quá trình tạo ra một ngôn ngữ mới phục vụ cho mục đích chạy được trên nhiều nền tảng, các kỹ sư của Sun MicroSystem muốn tạo ra một ngôn ngữ dễ học và quen thuộc với đa số người lập trình. Vì vậy họ đã sử dụng lại các cú pháp của C và C++.
Tuy nhiên, trong Java thao tác với con trỏ bị lược bỏ nhằm đảo bảo tính an toàn và dễ sử dụng hơn. Các thao tác overload, goto hay các cấu trúc như struct và union cũng được loại bỏ khỏi Java.
Độc lập phần cứng và hệ điều hành
Một chương trình viết bằng ngôn ngữ Java có thể chạy tốt ở nhiều môi trường khác nhau. Gọi là khả năng “cross-platform”. Khả năng độc lập phần cứng và hệ điều hành được thể hiện ở 2 cấp độ là cấp độ mã nguồn và cấp độ nhị phân.
Ở cấp độ mã nguồn: Kiểu dữ liệu trong Java nhất quán cho tất cả các hệ điều hành và phần cứng khác nhau. Java có riêng một bộ thư viện để hỗ trợ vấn đề này. Chương trình viết bằng ngôn ngữ Java có thể biên dịch trên nhiều loại máy khác nhau mà không gặp lỗi.
Ở cấp độ nhị phân: Một mã biên dịch có thể chạy trên nhiều nền tảng khác nhau mà không cần dịch lại mã nguồn. Tuy nhiên cần có Java Virtual Machine để thông dịch đoạn mã này.
Ngôn ngữ thông dịch
Ngôn ngữ lập trình thường được chia ra làm 2 loại (tùy theo các hiện thực hóa ngôn ngữ đó) là ngôn ngữ thông dịch và ngôn ngữ biên dịch.
- Thông dịch (Interpreter) : Nó dịch từng lệnh rồi chạy từng lệnh, lần sau muốn chạy lại thì phải dịch lại.
- Biên dịch (Compiler): Code sau khi được biên dịch sẽ tạo ra 1 file thường là .exe, và file .exe này có thể đem sử dụng lại không cần biên dịch nữa.
Ngôn ngữ lập trình Java thuộc loại ngôn ngữ thông dịch. Chính xác hơn, Java là loại ngôn ngữ vừa biên dịch vừa thông dịch. Cụ thể như sau
Khi viết mã, hệ thống tạo ra một tệp .java. Khi biên dịch mã nguồn của chương trình sẽ được biên dịch ra mã byte code. Máy ảo Java (Java Virtual Machine) sẽ thông dịch mã byte code này thành machine code (hay native code) khi nhận được yêu cầu chạy chương trình.

Ưu điểm : Phương pháp này giúp các đoạn mã viết bằng Java có thể chạy được trên nhiều nền tảng khác nhau. Với điều kiện là JVM có hỗ trợ chạy trên nền tảng này.
Nhược điểm : Cũng như các ngôn ngữ thông dịch khác, quá trình chạy các đoạn mã Java là chậm hơn các ngôn ngữ biên dịch khác (tuy nhiên vẫn ở trong một mức chấp nhận được).
Cơ chế thu gom rác tự động
Khi tạo ra các đối tượng trong Java, JRE sẽ tự động cấp phát không gian bộ nhớ cho các đối tượng ở trên heap.
Với ngôn ngữ như C \ C++, bạn sẽ phải yêu cầu hủy vùng nhớ mà bạn đã cấp phát, để tránh việc thất thoát vùng nhớ. Tuy nhiên vì một lý do nào đó, bạn không hủy một vài vùng nhớ, dẫn đến việc thất thoát và làm giảm hiệu năng chương trình.
Ngôn ngữ lập trình Java hỗ trợ cho bạn điều đó, nghĩa là bạn không phải tự gọi hủy các vùng nhớ. Bộ thu dọn rác của Java sẽ theo vết các tài nguyên đã được cấp. Khi không có tham chiếu nào đến vùng nhớ, bộ thu dọn rác sẽ tiến hành thu hồi vùng nhớ đã được cấp phát.
Đa luồng
Java hỗ trợ lập trình đa tiến trình (multithread) để thực thi các công việc đồng thời. Đồng thời cũng cung cấp giải pháp đồng bộ giữa các tiến trình (giải pháp sử dụng priority…).
Tính an toàn và bảo mật
- Tính an toàn
Ngôn ngữ lập trình Java yêu cầu chặt chẽ về kiểu dữ liệu.
Dữ liệu phải được khai báo tường minh.
Không sử dụng con trỏ và các phép toán với con trỏ.
Java kiểm soát chặt chẽ việc truy nhập đến mảng, chuỗi. Không cho phép sử dụng các kỹ thuật tràn. Do đó các truy nhập sẽ không vượt quá kích thước của mảng hoặc chuỗi.
Quá trình cấp phát và giải phóng bộ nhớ được thực hiện tự động.
Cơ chế xử lý lỗi giúp việc xử lý và phục hồi lỗi dễ dàng hơn.
- Tính bảo mật
Java cung cấp một môi trường quản lý chương trình với nhiều mức khác nhau.
Mức 1 : Chỉ có thể truy xuất dữ liệu cũng như phương phức thông qua giao diện mà lớp cung cấp.
Mức 2 : Trình biên dịch kiểm soát các đoạn mã sao cho tuân thủ các quy tắc của ngôn ngữ lập trình Java trước khi thông dịch.
Mức 3 : Trình thông dịch sẽ kiểm tra mã byte code xem các đoạn mã này có đảm bảo được các quy định, quy tắc trước khi thực thi.
Mức 4: Java kiểm soát việc nạp các lớp vào bộ nhớ để giám sát việc vi phạm giới hạn truy xuất trước khi nạp vào hệ thống.
Máy ảo Java (JVM – Java Virtual Machine)
Để đảm bảo tính đa nền, Java sử dụng cơ chế Máy ảo của Java.
ByteCode là ngôn ngữ máy của Máy ảo Java tương tự như các lệnh nhị phân của các máy tính thực.
Một chương trình sau khi được viết bằng ngôn ngữ Java (có phần mở rộng là .java) phải được biên dịch thành tập tin thực thi được trên máy ảo Java (có phần mở rộng là .class). Tập tin thực thi này chứa các chỉ thị dưới dạng mã Bytecode mà máy ảo Java hiểu được phải làm gì.
Khi thực hiện một chương trình, máy ảo Java lần lượt thông dịch các chỉ thị dưới dạng Bytecode thành các chỉ thị dạng nhị phân của máy tính thực và thực thi thực sự chúng trên máy tính thực (còn gọi là khả năng khả chuyển).
Máy ảo thực tế đó là một chương trình thông dịch. Vì thế các hệ điều hành khác nhau sẽ có các máy ảo khác nhau. Để thực thi một ứng dụng của Java trên một hệ điều hành cụ thể, cần phải cài đặt máy ảo tương ứng cho hệ điều hành đó.
JVM cung cấp môi trường thực thi cho chương trình Java (còn gọi là khả năng độc lập với nền).
Có nhiều JVM cho các nền tảng khác nhau chẳng hạn như: Windows, Liux, và Mac.

Các loại ứng dụng được phát triển sử dụng Java

Các phiên bản của Java

Java Standard Edition (Java SE) – Là một nền tảng cơ bản cho phép phát triển giao diện điều khiển, các ứng dụng mạng và các ứng dụng dạng Win Form.
Java Enterprise Edition (Java EE) – Được xây dựng trên nền tảng Java SE, giúp phát triển các ứng dụng web, các ứng dụng ở cấp doanh nghiệp, …
Java Mobile Edition (Java ME) – Là một nền tảng cho phép phát triển các ứng dụng nhúng vào các thiết bị điện tử như mobile,…
Các thành phần của Java SE Platform
Gồm 2 thành phần:
- JRE (Java Runtime Environment): cung cấp JVM (Java Virtual Machine) và thư viện được sử dụng để chạy chương trình Java.
- JDK (Java Development Kit): được biết đến như bộ cung cụ phát triển Java, bao gồm: trình biên dịch và trình gỡ rối được sử dụng để phát triển các ứng dụng Java.

Học lập trình Java từ đâu và như thế nào?
Đâu là những kiến thức cần có khi học lập trình java làm backend web developer? Để tìm hiểu và Học Java bạn nên bắt đầu nắm vững những khái niệm cơ bản nhất. Từ đó khai triển lên kiến thức nâng cao hơn. Vậy các keyword chính khi học Java để trở thành một Java Web Developer là gì?
Java là một trong những ngôn ngữ bậc cao được nhiều công ty và các tổ chức trên thế giới tin dùng, Ngôn ngữ Java được thiết kế vào những năm 90s bởi tổ chức Sun Micro system hiện nay thuộc sở hữu của Oracle. Java có tính độc lập rất cao, tiện lợi, có thể dùng cho việc cross-platform, có nghĩa bạn chỉ cần viết chương trình một lần thì có thể chạy trên nhiều nền tảng khác nhau. Khẩu hiệu kinh điển mà bất kỳ dân lập trình Java nào cũng biết đó là “Viết một lần, chạy được khắp nơi” (Write Once Run Anywhere).
Học Java căn bản thì bắt đầu từ đâu?
Để bắt đầu học lập trình Java, bạn phải cần thông thạo các ngôn ngữ lập trình hướng đối tượng, có thể học qua lập trình C để làm quen với những khái niệm của loại lập trình này cũng như có thể hiểu sâu hơn về Java và các công nghệ Java mà nhiều người thường sử dụng như:
-Java Core
-Enterprise Java Beans
-JSP/Java Severlet
-JDBC và RMI
Java core
Nhắc đến Java backend developer chắc chắn phải nằm lòng kiến thức căn bản của ngôn ngữ lập trình java: JAVA CORE là kiến thức nền tảng của ngôn ngữ lập trình JAVA, nó sẽ là bước khởi đầu để bạn có thể học những kiến thức nâng cao như: JSP- Servlet – Android.
- Java là ngôn ngữ lập trình hướng đối tượng (OOP)
Lập trình hướng đối tượng (OOP) là một kỹ thuật lập trình cho phép lập trình viên tạo ra các đối tượng trong code trừu tượng hóa các đối tượng. Đối tượng là những sự vật, sự việc mà nó có những tính chất, đặc tính, hành động giống nhau và ta gom góp lại thành đối tượng giống trong thực tế cuộc sống. Khi lập trình OOP, chúng ta sẽ định nghĩa các lớp (class) để gom (mô hình) các đối tượng thực tế.
- Cách sử dụng câu điều kiện: if/else
Trong ngôn ngữ lập trình Java cũng như các ngôn ngữ lập trình khác, cấu trúc điều khiển if – else sẽ kiểm tra kết quả của 1 điều kiện và dựa vào kết quả đó để thực hiện các hành động tương ứng. Có bốn loại câu lệnh if trong java: Câu lệnh IF; Câu lệnh if -else; Câu lệnh if -else -if; Câu lệnh if lồng nhau.
- Sử dụng vòng lặp: for/while
Vòng lặp for trong java được sử dụng để lặp một phần của chương trình nhiều lần. Nếu số lần lặp là cố định thì vòng lặp for được khuyến khích sử dụng, còn nếu số lần lặp không cố định thì nên sử dụng vòng lặp while hoặc do while. Có 3 kiểu của vòng lặp for trong java: Vòng lặp for đơn giản; Vòng lặp for cải tiến; Vòng lặp for gán nhãn.
- Exception là gì và cách xử lý exception (xử lý ngoại lệ) trong Java
Exception trong Java được xem là một sự kiện làm gián đoạn luồng làm việc bình thường của chương trình đó. Nó là một đối tượng được ném ra tại runtime. Cụ thể là khi một chương trình đang chạy exception sẽ khiến nó lập tức dừng lại và xuất hiện thông báo lỗi. Một ví dụ trực quan nhất là khi bạn tiến hành thực hiện phép chia một số nguyên dương cho số 0 thì khi biên dịch chương trình sẽ làm phát sinh lỗi và đó được coi là ngoại lệ.
- Checked Exception
Check Exception là các Exception xảy ra tại thời điểm Compile time (là thời điểm chương trình đang được biên dịch). Những Exception này thường liên quan đến lỗi cú pháp (syntax) và bắt buộc chúng ta phải “bắt” (catch) nó.
- Unchecked Exception
Unchecked Exception được xem là các Exception xảy ra tại thời điểm Runtime (là thời điểm chương trình đang chạy). Những Exception này thường liên quan đến lỗi logic và không bắt buộc chúng ta phải “bắt” (catch) nó.
- Các cấu trúc dữ liệu: chuỗi, mảng, HashMap, LinkedList
Đối với các ngôn ngữ lập trình, chuỗi và mảng là 2 kiểu dữ liệu rất quan trọng. Trong ngôn ngữ lập trình Java, chuỗi được coi là 1 dữ liệu dạng đối tượng (tức là nó có các thuộc tính và phương thức – chi tiết về đối tượng chúng ta sẽ được học trong chương Lập trình hướng đối tượng).
Trong lập trình Java, mảng (array) là một tập hợp các phần tử có cùng kiểu dữ liệu, có địa chỉ tiếp nhau trên bộ nhớ (memory). Mảng có số phần tử cố định và bạn không thể thay đổi kích thước của nó.. Mỗi phần tử của mảng được sử dụng như là một biến đơn, kiểu dữ liệu của mảng chính là kiểu dữ liệu của phần tử.

Mảng được sử khá nhiều, có tính ứng dụng cao không chỉ bởi sự đơn giản cũng như khả năng đáp ứng nhu cầu lưu trữ dữ liệu trong các bài toán thực tế. Các lập trình viên có nhiều kinh nghiệm thường sử dụng mảng khi cần lưu trữ nhiều giá trị, chẳng hạn như lưu trữ các số nguyên từ 1 đến 5; dãy 32 chuỗi ký tự v.v…
Trong Java, mảng được hỗ trợ dưới dạng mảng một chiều cho đến mảng nhiều chiều. Tuy nhiên tối đa chỉ sử dụng mảng ba chiều và được dùng nhiều nhất là mảng một chiều.
- Java còn là ngôn ngữ lập trình đa luồng multithreading
Trong Java có hai khái niệm multi: multithreading (đa luồng) và multitasking (đa tiến trình). Đa luồng khi chương trình đó có 2 luồng trở lên chạy song song với nhau và một luồng (thread) là đơn vị nhỏ nhất của tiến trình (process). Trong đó, luồng – đơn vị nhỏ nhất trong chương trình có thể thực hiện được một công việc riêng biệt, được quản lý bởi máy ảo Java. Bốn thành phần chính của một luồng bao gồm: định dang, một bộ đếm chương trình, một tập thanh ghi và ngăn xếp. Một ứng dụng Java ngoài luồng chính có thể có các luồng khác thực thi đồng thời. Với đa luồng, công việc của Java được xử lý nhanh chóng hơn.
Cấu trúc dữ liệu và giải thuật
Khi làm việc phía backend, Java developer cần thao tác nhiều với dữ liệu và làm sao để xử lý luồng dữ liệu nhanh nhất và chính xác nhất.
Cấu trúc dữ liệu và giải thuật được xem là 2 yếu tố quan trọng trong lập trình. Data structure bao gồm 3 mức độ: cơ bản: stack (ngăn xếp), queue (hàng đợi), linkedlist (danh sách liên kết), binary tree (cây nhị phân); trung bình: Heap, Priority queue, Huffman Tree, Hash Table (Bảng băm); nâng cao: segment Tree, Binary Indexed Tree, Spare Table, ….
JSP và Servlet
Sau khi đã nắm vững các khái niệm Java core cùng cấu trúc dữ liệu và giải thuật, bạn sẽ cần học thêm về JSP và Servlet. Trong quá trình học, bạn sẽ biết đến J2EE, là nền tảng lập trình cho các ứng dụng phân tán (trong đó web chính là nền tảng dạng như ứng dụng phân tán), từ đó tiếp cận với các khái niệm mới như API, SML, JDBC, JMS.
Enterprise và Java Beans

Enterprise Java Beans (EJB) là một thành viên trong gia đình J2EE, là nền tảng có nhiệm vụ xây dựng các thành phần phần mềm có tính di động và có thể reusable (sử dụng lại). Từ đó các developer có thể xây dựng và triển khai các distributed application (ứng dụng phân tán) dễ dàng, thuận lợi hơn.
Đích đến của EJB là các enterprise (ứng dụng thương mại), lớn, phân tán. Từ đó, EJB có nhiệm vụ quy định kiến trúc và đặc tả cho việc phát triển và triển khai các component (thành phần) thuộc server-side của distributed application. Các component này được các tổ chức phát triển build ứng dụng hay được một bên thứ ba mua laị.
JDBC và RMI là gì

JDBC là Java API có nhiệm vụ kết nối và thực hiện truy vấn database (cơ sở dữ liệu), sử dụng trình điều khiển JDBC để kết nối với database. Trước JDBC, ODBC được sử dụng để làm nhiệm vụ trên, tuy nhiên ODBC đuợc biết bằng nền tảng phụ thuộc (ngôn ngữ C) nên Java đã tự định nghĩa API của chính mình và sử dụng JDBC được viết trên nền tảng Java.

Giải thích thuật ngữ: skeleton: lớp nối phía server; stub: lớp móc chuyển về cho client. RMI không gọi trực tiếp mà thông qua 2 lớp trung gian này.
- Java RMI (Remote Method Invocation – Gọi phương thức từ xa): một kỹ thuật của Java cài đặt distributed object (đối tượng phân tán) hiệu quả và linh động.
- Một số đặc tính của RMI:
- Là mô hình distributed object của Java, giúp truyền thông giữa các distributed object dễ dàng hơn.
- API bậc cao xây dựng dựa trên lập trình socket.
- Không những cho phép truyền data giữa các object trên các hệ thống khác nhau mà còn gọi được các phương thức trong các đối tượng remote.
- Quá trình truyền data giữa các máy được xử lý trong suốt với Java virtual machine (máy ảo Java).
- Cung cấp callback, cho phép Server gọi ngược phương thức ở Client.
Các framework của Java gồm những gì?
STRUTS
SPRINGS
Đây là hai framework khá lâu đời và được phát triển dựa trên nền tảng của J2EE, hỗ trợ việc xây dựng web bằng ngôn ngữ Java theo hướng MVC: viết tắt cho model view controller, một pattern khá nổi tiếng khi thiết kế phần mềm.
Trong quá trình học Springs/struts bạn cũng cần tìm hiểu về thư viện liên quan tới thao tác về mặt database trong ứng dụng S/S: JPA hay Hibernate. mvc
Lộ Trình cơ bản của lập trình viên Java
Tham khảo lộ trình chi tiết khi học ngôn ngữ Java qua roadmap dưới đây:

Lượng kiến thức phải học Java để theo con đường web developer không phải là ít, cũng không thể hoàn thành trong một sớm một chiều. Cách nhanh nhất và học hiệu quả nhất của người theo đuổi Java Web Developer chính là định hướng rõ ràng, đặt mục tiêu và dành thời gian, công sức một cách nghiêm túc.
Các tài liệu lập trình Java từ căn bản nâng cao
1. Tài liệu Java cơ bản của Đại Học Quốc Gia Hà Nội
Chú ý đây là giáo trình dành cho những người đã có một ít kiến thức về Java bao gồm 58 chương từ cơ bản đến nâng cao. Bạn có thể tự học bằng tại liệu này một cách rất dễ dàng.Ngoài mục đích thực hành các nội dung liên quan đến lập trình hướng đối tượng, các bài tập thực hành của môn học này nên có thêm đóng vai trò định hướng và gợi ý giúp đỡ các lập trình viên tự học các chủ đề thuần túy Java, hiểu sâu những giá trị cốt lõi để có thể phát triển hơn trong tương lai.Các thuật ngữ hướng đối tượng nguyên gốc tiếng Anh đã được chuyển sang tiếng Việt theo những cách khác nhau tùy các tác giả. lập trình viên cần biết thuật ngữ nguyên gốc tiếng Anh cũng như các cách dịch khác nhau đó để tiện cho việc sử dụng tài liệu tiếng Anh cũng như để liên hệ kiến thức giữa các tài liệu tiếng Việt. Vì lí do đó, giáo trình này cung cấp bảng thuật ngữ Anh-Việt với các cách dịch khác nhau tại Phụ lục C, bên cạnh Phụ lục A về công cụ lập trình JDK và Phụ lục B về tổ chức gói của ngôn ngữ JavaTải ngay tài liệu tại đây
2. Blog học lập trình Java căn bản đến nâng cao đầy đủ nhất
Hơn hẳn những khóa học hàn lâm, học qua blog là một trong những cách thiết thực nhất giúp bạn có thể nắm được những kinh nghiệm được truyền từ những đàn anh đi trước. Hãy cùng xem qua những blog học lập trình Java mà bạn có thể tham khảo trực tiếp nhé.
- Think Java: Cách suy nghĩ như nhà khoa học máy tính
- Blog của Nguyễn Văn Hương – chuyên về Java và những công nghệ mới nhất ngành lập trình
- Advance Programming – Trần Duy Thanh chuyên về nhiều lĩnh vực lập trình trong đó có cả Java, lập trình di động, NodeJS
3. Học trực tiếp từ Website của Java
Có lẽ việc học lập trình tốt nhất vẫn chính là học qua website chính thức của chính ngôn ngữ lập trình Java. Tại website chính thức của Java bạn cũng có thể được học trực tiếp từ những chuyên gia của họ, đồng thời tham gia các workshop cũng như webinar rất hữu ích.
Ngoài ra bạn cũng có thể tham khảo thêm những nội dung của trang FreeJavaGuide và trang laptrinhjavaweb, đây cũng là một trong những nơi có chứa đầy đủ nhất thông tin cho những ai cần tham khảo và tìm hiểu thông tin về lập trình Java.
Java (ngôn ngữ lập trình)
Java (phiên âm Tiếng Việt: “Gia-va”) là một ngôn ngữ lập trình hướng đối tượng, dựa trên lớp được thiết kế để có càng ít phụ thuộc thực thi càng tốt. Nó là ngôn ngữ lập trình có mục đích chung cho phép các nhà phát triển ứng dụng viết một lần, chạy ở mọi nơi (WORA),[9] nghĩa là mã Java đã biên dịch có thể chạy trên tất cả các nền tảng hỗ trợ Java mà không cần biên dịch lại.[10] Các ứng dụng Java thường được biên dịch thành bytecode có thể chạy trên bất kỳ máy ảo Java (JVM) nào bất kể kiến trúc máy tính bên dưới. Cú pháp của Java tương tự như C và C++, nhưng có ít cơ sở cấp thấp hơn các ngôn ngữ trên. Java runtime cung cấp các khả năng động (chẳng hạn như phản ánh và sửa đổi mã thời gian chạy) thường không có sẵn trong các ngôn ngữ biên dịch truyền thống. Tính đến năm 2019 Java là một trong những ngôn ngữ lập trình phổ biến nhất được sử dụng theo GitHub,[11][12] đặc biệt cho các ứng dụng web máy khách-máy chủ, với 9 triệu nhà phát triển đã được báo cáo.[13]
Java ban đầu được James Gosling tại Sun Microsystems (sau đó đã được Oracle mua lại) phát triển và được phát hành vào năm 1995 như một thành phần cốt lõi của nền tảng Java của Sun Microsystems. Các trình biên dịch Java, máy ảo và thư viện lớp thực thi gốc và tham chiếu ban đầu được Sun phát hành theo giấy phép độc quyền. Kể từ tháng 5 năm 2007, tuân theo các thông số kỹ thuật của Quy trình Cộng đồng Java, Sun đã cấp phép hầu hết các công nghệ Java của mình theo Giấy phép Công cộng GNU. Oracle cung cấp Máy ảo Java HotSpot của riêng mình, tuy nhiên việc triển khai tham chiếu chính thức là OpenJDK JVM, là phần mềm mã nguồn mở miễn phí và được hầu hết các nhà phát triển sử dụng và là JVM mặc định cho hầu hết các bản phân phối Linux.
Tính đến tháng 9 năm 2020, phiên bản mới nhất là Java 15, với Java 11, một phiên bản hỗ trợ dài hạn (LTS), được phát hành vào 25 tháng 9 năm 2018. Oracle phát hành bản cập nhật miễn phí cho công chúng với phiên bản kế thừa Java 8 LTS vào tháng 1 năm 2019 cho mục đích sử dụng thương mại, mặc dù nếu không nó sẽ vẫn hỗ trợ Java 8 với các bản cập nhật công khai cho mục đích sử dụng cá nhân vô thời hạn. Các nhà cung cấp khác đã bắt đầu cung cấp các bản miễn phí của OpenJDK 8 và 11 mà vẫn đang nhận được bảo mật và các nâng cấp khác.
Oracle (và những công ty khác) khuyên người dùng nên gỡ cài đặt các phiên bản Java đã lỗi thời vì những rủi ro nghiêm trọng do các vấn đề bảo mật chưa được giải quyết.[14] Vì Java 9, 10, 12, 13 và 14 không còn được hỗ trợ, Oracle khuyên người dùng nên chuyển ngay sang phiên bản mới nhất (hiện tại là Java 15) hoặc bản phát hành LTS.
Lịch sử
James Gosling, Mike Sheridan và Patrick Naughton khởi xướng dự án ngôn ngữ Java vào tháng 6 năm 1991.[15] Java ban đầu được thiết kế cho truyền hình tương tác, nhưng nó quá tiên tiến đối với ngành truyền hình cáp kỹ thuật số vào thời điểm đó.[16] Ban đầu ngôn ngữ này được gọi là Oak theo tên một cây sồi bên ngoài văn phòng của Gosling. Sau đó, dự án có tên là Green và cuối cùng được đổi tên thành Java, từ cà phê Java, loại cà phê đến từ Indonesia.[17] Gosling đã thiết kế Java với cú pháp kiểu C/C++ mà các lập trình viên hệ thống và ứng dụng đã quen thuộc.[18]
Sun Microsystems đã phát hành bản triển khai công khai đầu tiên dưới dạng Java 1.0 vào năm 1996.[19] Nó hứa hẹn khả năng Viết một lần, Chạy mọi nơi ( WORA ), cung cấp thời gian chạy miễn phí trên các nền tảng phổ biến. Khá an toàn và có tính năng bảo mật có thể định cấu hình, nó cho phép các hạn chế truy cập mạng và tệp. Các trình duyệt web lớn đã sớm kết hợp khả năng chạy các ứng dụng Java trong các trang web và Java nhanh chóng trở nên phổ biến. Trình biên dịch Java 1.0 được viết lại bằng Java bởi Arthur van Hoff để tuân thủ nghiêm ngặt đặc tả ngôn ngữ Java 1.0.[20] Với sự ra đời của Java 2 (ban đầu được phát hành với tên gọi J2SE 1.2 vào tháng 12 năm 1998 – 1999), các phiên bản mới có nhiều cấu hình được xây dựng cho các loại nền tảng khác nhau. J2EE bao gồm các công nghệ và API cho các ứng dụng doanh nghiệp thường chạy trong môi trường máy chủ, trong khi các API đặc trưng của J2ME được tối ưu hóa cho các ứng dụng di động. Phiên bản dành cho máy tính để bàn được đổi tên thành J2SE. Năm 2006, vì mục đích tiếp thị, Sun đã đổi tên các phiên bản J2 mới lần lượt là Java EE, Java ME và Java SE.
Năm 1997, Sun Microsystems đã tiếp cận cơ quan tiêu chuẩn ISO/IEC JTC 1 và sau đó là Ecma International để chính thức hóa Java, nhưng sau đó công ty nhanh chóng rút khỏi quy trình này.[21][22][23] Java vẫn là một tiêu chuẩn thực tế, được kiểm soát thông qua Quy trình cộng đồng Java.[24] Đã có lúc, Sun cung cấp hầu hết các triển khai Java của mình mà không tính phí, bất chấp trạng thái phần mềm độc quyền của họ. Sun đã tạo ra doanh thu từ Java thông qua việc bán giấy phép cho các sản phẩm chuyên biệt như Hệ thống Doanh nghiệp Java.
Vào ngày 13 tháng 11 năm 2006, Sun đã phát hành phần lớn máy ảo Java (JVM) của mình dưới dạng phần mềm mã nguồn mở và miễn phí (FOSS), theo các điều khoản của Giấy phép Công cộng GNU (GPL). Vào ngày 8 tháng 5 năm 2007, Sun đã hoàn thành quá trình, cung cấp tất cả mã cốt lõi của JVM theo các điều khoản phân phối phần mềm miễn phí / nguồn mở, ngoại trừ một phần nhỏ mã mà Sun không giữ bản quyền.[25][26]
Phó chủ tịch Rich Green của Sun nói rằng vai trò lý tưởng của Sun đối với Java là như một nhà truyền giáo .[27] Sau khi Tập đoàn Oracle mua lại Sun Microsystems vào năm 2009–10, Oracle đã tự mô tả mình là người quản lý công nghệ Java với cam kết không ngừng thúc đẩy cộng đồng tham gia và minh bạch.[28] Điều này không ngăn được Oracle đệ đơn kiện Google ngay sau đó vì đã sử dụng Java bên trong Android SDK.
Ngày 2 tháng 4 năm 2010, James Gosling từ chức tại Oracle.[29]
Vào tháng 1 năm 2016, Oracle đã thông báo rằng môi trường thời gian chạy Java dựa trên JDK 9 sẽ ngừng cung cấp plugin trình duyệt.[30]
Phần mềm Java chạy trên mọi thứ, từ máy tính xách tay đến trung tâm dữ liệu, bảng điều khiển trò chơi đến siêu máy tính khoa học.
Nguyên tắc
Có 5 mục tiêu chính trong việc xây dựng ngôn ngữ Java:[32]
Nó phải đơn giản, hướng đối tượng và quen thuộc.
Nó phải mạnh mẽ và an toàn.
Nó phải là kiến trúc trung lập và di động.
Nó phải thực thi với hiệu suất cao.
Nó phải được thông dịch, phân luồng và động.
Phiên bản
Các phiên bản Java đã phát hành:
Version | Date |
---|---|
JDK Beta | 1995 |
JDK1.0 | ngày 23 tháng 1 năm 1996 |
JDK 1.1 | ngày 19 tháng 2 năm 1997 |
J2SE 1.2 | ngày 8 tháng 12 năm 1998 |
J2SE 1.3 | ngày 8 tháng 5 năm 2000 |
J2SE 1.4 | ngày 6 tháng 2 năm 2002 |
J2SE 5.0 | ngày 30 tháng 9 năm 2004 |
Java SE 6 | ngày 11 tháng 12 năm 2006 |
Java SE 7 | ngày 28 tháng 7 năm 2011 |
Java SE 8 | ngày 18 tháng 3 năm 2014 |
Java SE 9 | ngày 21 tháng 9 năm 2017 |
Java SE 10 | ngày 20 tháng 3 năm 2018 |
Java SE 11 | ngày 25 tháng 9 năm 2018 |
Java SE 12 | ngày 19 tháng 3 năm 2019 |
Java SE 13 | ngày 17 tháng 9 năm 2019 |
Java SE 14 | ngày 17 tháng 3 năm 2020 |
Java SE 15 | ngày 15 tháng 9 năm 2020 |
Edition
Sun đã xác định và hỗ trợ bốn phiên bản Java nhắm mục tiêu các môi trường ứng dụng khác nhau và phân đoạn nhiều API của nó để chúng thuộc về một trong các nền tảng. Các nền tảng là:
Java Card cho thẻ thông minh.[35]
Nền tảng Java, Phiên bản Micro (Java ME) – nhắm mục tiêu môi trường với tài nguyên hạn chế.[36]
Nền tảng Java, Phiên bản Tiêu chuẩn (Java SE) – nhắm mục tiêu môi trường máy trạm.[37]
Nền tảng Java, Phiên bản Doanh nghiệp (Java EE) – nhắm mục tiêu các môi trường doanh nghiệp hoặc Internet phân tán lớn.[38]
Các lớp trong Java API được tổ chức thành các nhóm riêng biệt gọi là gói. Mỗi gói chứa một tập hợp các giao diện, lớp, gói con và ngoại lệ liên quan.
Sun cũng cung cấp một phiên bản có tên là Personal Java đã được thay thế bằng các cặp cấu hình Java ME dựa trên tiêu chuẩn sau này.
Hệ thống thực thi
Java JVM và bytecode
Một mục tiêu thiết kế của Java là tính di động, có nghĩa là các chương trình được viết cho nền tảng Java phải chạy tương tự nhau trên bất kỳ sự kết hợp nào giữa phần cứng và hệ điều hành với hỗ trợ thời gian chạy thích hợp. Điều này đạt được bằng cách biên dịch mã ngôn ngữ Java sang một đại diện trung gian được gọi là Java bytecode, thay vì trực tiếp tới mã máy cụ thể về kiến trúc. Các lệnh mã bytecode trong Java tương tự như mã máy, nhưng chúng được thiết kế để thực thi bởi một máy ảo (VM) được viết riêng cho phần cứng máy chủ. Người dùng cuối thường sử dụng Java Runtime Environment (JRE) được cài đặt trên máy của họ cho các ứng dụng Java độc lập hoặc trong trình duyệt web cho các ứng dụng Java.
Các thư viện tiêu chuẩn cung cấp một cách chung để truy cập các tính năng dành riêng cho máy chủ như đồ họa, phân luồng và mạng.
Việc sử dụng bytecode phổ biến làm cho việc chuyển cổng trở nên đơn giản. Tuy nhiên, chi phí của việc thông dịch bytecode thành các lệnh máy làm cho các chương trình được thông dịch hầu như luôn chạy chậm hơn các chương trình thực thi gốc. Các trình biên dịch Just-in-time (JIT) biên dịch mã byte thành mã máy trong thời gian chạy đã được giới thiệu từ giai đoạn đầu. Bản thân Java độc lập với nền tảng và được điều chỉnh cho phù hợp với nền tảng cụ thể mà máy ảo Java (JVM) chạy trên nó, máy này sẽ dịch mã bytecode của Java sang ngôn ngữ máy của nền tảng.
Hiệu suất
Các chương trình được viết bằng Java nổi tiếng là chậm hơn và đòi hỏi nhiều bộ nhớ hơn các chương trình được viết bằng C++ .[40][41] Tuy nhiên, tốc độ thực thi của các chương trình Java được cải thiện đáng kể với sự ra đời của tính năng biên dịch đúng lúc vào năm 1997/1998 cho Java 1.1,[42] việc bổ sung các tính năng ngôn ngữ hỗ trợ phân tích mã tốt hơn (chẳng hạn như các lớp bên trong, lớp StringBuilder, các xác nhận tùy chọn, v.v.) và tối ưu hóa trong máy ảo Java, chẳng hạn như HotSpot trở thành mặc định cho JVM của Sun vào năm 2000. Với Java 1.5, hiệu suất đã được cải thiện với việc bổ sung gói java.util.concurrent, bao gồm khóa các triển khai miễn phí của ConcurrentMaps và các bộ sưu tập đa lõi khác và nó đã được cải thiện hơn nữa với Java 1.6.
Không JVM
Một số nền tảng cung cấp hỗ trợ phần cứng trực tiếp cho Java; có những bộ điều khiển vi mô có thể chạy Java bytecode trong phần cứng thay vì máy ảo Java phần mềm,[43] và một số bộ xử lý dựa trên ARM có thể có hỗ trợ phần cứng để thực thi Java bytecode thông qua tùy chọn Jazelle của chúng, mặc dù hỗ trợ hầu hết đã bị loại bỏ trong các triển khai hiện tại của ARM.
Quản lý bộ nhớ tự động
Java sử dụng bộ thu gom rác tự động (AGC) để quản lý bộ nhớ trong vòng đời đối tượng. Lập trình viên xác định thời điểm các đối tượng được tạo và thời gian chạy Java chịu trách nhiệm khôi phục bộ nhớ khi các đối tượng không còn được sử dụng. Khi không còn tham chiếu đến một đối tượng, bộ nhớ không thể truy cập sẽ đủ điều kiện để được giải phóng tự động bởi bộ thu gom rác. Một cái gì đó tương tự như rò rỉ bộ nhớ vẫn có thể xảy ra nếu mã của lập trình viên giữ một tham chiếu đến một đối tượng không còn cần thiết, thường là khi các đối tượng không còn cần thiết được lưu trữ trong các bộ chứa vẫn đang được sử dụng. Nếu các phương thức cho một đối tượng không tồn tại được gọi, một ngoại lệ con trỏ null sẽ được đưa ra.[44][45]
Một trong những ý tưởng đằng sau mô hình quản lý bộ nhớ tự động của Java là các lập trình viên có thể không phải chịu gánh nặng khi phải thực hiện quản lý bộ nhớ thủ công. Trong một số ngôn ngữ, bộ nhớ để tạo các đối tượng được cấp phát ngầm trên ngăn xếp hoặc được cấp phát và phân bổ rõ ràng từ heap. Trong trường hợp thứ hai, trách nhiệm quản lý bộ nhớ thuộc về lập trình viên. Nếu chương trình không phân bổ một đối tượng, một rò rỉ bộ nhớ sẽ xảy ra. Nếu chương trình cố gắng truy cập hoặc phân bổ bộ nhớ đã được phân bổ, kết quả là không xác định và khó dự đoán, và chương trình có thể trở nên không ổn định hoặc gặp sự cố. Điều này có thể được khắc phục một phần bằng cách sử dụng các con trỏ thông minh, nhưng chúng làm tăng thêm chi phí và sự phức tạp. Lưu ý rằng việc thu gom rác không ngăn chặn rò rỉ bộ nhớ logic, tức là những nơi bộ nhớ vẫn được tham chiếu nhưng không bao giờ được sử dụng.
Việc thu gom rác có thể xảy ra bất cứ lúc nào. Lý tưởng nhất, nó sẽ xảy ra khi một chương trình không hoạt động. Nó được đảm bảo sẽ được kích hoạt nếu không có đủ bộ nhớ trống trên heap để cấp phát một đối tượng mới; điều này có thể khiến một chương trình bị dừng trong giây lát. Không thể quản lý bộ nhớ rõ ràng trong Java.
Java không hỗ trợ số học con trỏ kiểu C/C++, trong đó địa chỉ đối tượng có thể được thao tác số học (ví dụ: bằng cách thêm hoặc trừ một phần bù). Điều này cho phép bộ thu gom rác di chuyển các đối tượng được tham chiếu và đảm bảo an toàn và bảo mật kiểu.
Giống như trong C++ và một số ngôn ngữ hướng đối tượng khác, các biến của kiểu dữ liệu nguyên thủy của Java hoặc được lưu trữ trực tiếp trong các trường (đối với các đối tượng) hoặc trên ngăn xếp (đối với các phương thức) chứ không phải trên heap, điều này thường đúng đối với dữ liệu không nguyên thủy các loại (nhưng hãy xem phân tích thoát). Đây là một quyết định có ý thức của các nhà thiết kế của Java vì lý do hiệu suất.
Java chứa nhiều loại trình thu gom rác. Theo mặc định, HotSpot sử dụng bộ thu gom rác quét song song.[46] Tuy nhiên, cũng có một số trình thu gom rác khác có thể được sử dụng để quản lý đống rác. Đối với 90% ứng dụng trong Java, bộ thu gom rác đồng thời Mark-Sweep (CMS) là đủ.[47] Oracle đặt mục tiêu thay thế CMS bằng Garbage-First Collector (G1).[48]
Giải quyết được vấn đề quản lý bộ nhớ không giúp lập trình viên bớt gánh nặng xử lý đúng cách các loại tài nguyên khác, như kết nối mạng hoặc cơ sở dữ liệu, xử lý tệp, v.v., đặc biệt là khi có lỗi.
Các lớp đặc biệt
Applet
Java applet là các chương trình được nhúng vào trong các ứng dụng khác, thường là trong một trang web hiển thị trong trình duyệt web. API của Java applet hiện không còn được dùng nữa kể từ ngày 9 tháng 1 năm 2017.
Servlet
Công nghệ Java servlet cung cấp cho các nhà phát triển Web một cơ chế nhất quán, đơn giản để mở rộng chức năng của máy chủ Web và để truy cập các hệ thống kinh doanh hiện có. Servlet là các thành phần Java EE phía máy chủ tạo ra các phản hồi (thường là các trang HTML) cho các yêu cầu (thường là các yêu cầu HTTP) từ máy khách.
Ở một mức độ nào đó, API của Java servlet đã được thay thế bởi hai công nghệ Java cho dịch vụ web:
Java API cho RESTful Web Services (JAX-RS 2.0) hữu ích cho AJAX, JSON và dịch vụ REST, và
Java API cho XML Web Services (JAX-WS) hữu ích cho dịch vụ web SOAP.
Sự phổ biến
Tính đến ngày 21 tháng 01 năm 2021, Java là ngôn ngữ lập trình phổ biến thứ nhì thế giới với tỉ lệ 11,96% chỉ xếp sau ngôn ngữ C. Qua nhiều năm Java và C vẫn luôn chiếm hai vị trí đầu tiên trong bảng các ngôn ngữ lập trình phổ biến nhất suốt 20 năm qua, tuy những năm gần đây độ phổ biến có xu hướng giảm nhưng Java vẫn giữ được tỉ lệ trên 10% mặc cho sự phát triển chóng mặt của thế giới công nghệ, Java thể hiện đẳng cấp một ngôn ngữ lập trình chất lượng của nhân loại.
Để lại một phản hồi