Showing posts with label Java. Show all posts
Showing posts with label Java. Show all posts

Thursday, December 31, 2009

Các khái niệm lập trình hướng đối tượng OOP

Một đối tượng là gì?

Java được biết đến như một ngôn ngữ hướng đối tượng (OO - object-oriented), bạn có thể sử dụng ngôn ngữ này để lập trình hướng đối tượng. Điều này rất khác so với lập trình thủ tục, và có thể hơi lạ lùng đối với hầu hết các lập trình viên không hướng đối tượng. Bước đầu tiên bạn phải hiểu đối tượng là gì, vì đó là khái niệm cơ sở của OOP.

Một đối tượng là một bó mã lệnh tự thân trọn vẹn (self-contained), tự hiểu chính mình và có thể nói cho các đối tượng khác về chính mình nếu chúng đưa ra các yêu cầu mà nó hiểu được. Một đối tượng có các thành phần dữ liệu (các biến) và các phương thức, chính là những yêu cầu mà nó biết cách trả lời (dù chúng không được diễn đạt bằng lời như các câu hỏi). Tập các phương thức mà một đối tượng biết cách trả lời được gọi là giao diện của đối tượng. Một vài phương thức là mở công cộng, nghĩa là các đối tượng khác có thể gọi đến chúng. Tập các phương thức này được gọi là giao diện công cộng của đối tượng.

Khi một đối tượng gọi phương thức của một đối tượng khác, thì được gọi là gửi một thông điệp (sending a message hoặc message send). Cụm từ này là thuật ngữ của OO nhưng hầu hết trong giới Java mọi người hay nói, “gọi phương thức này” hơn là “gửi thông điệp này”. Trong phần tiếp theo, chúng ta sẽ xem xét một ví dụ minh họa khái niệm giúp bạn hiểu vấn đề này rõ ràng hơn.

Ví dụ minh họa khái niệm đối tượng

Giả sử chúng ta có đối tượng Person. Mỗi Person có tên, tuổi, chủng tộc và giới tính. Mỗi Person cũng biết nói và biết đi. Một Person có thể hỏi tuổi của một Person khác, hoặc yêu cầu một Person khác bắt đầu đi (hay dừng). Diễn đạt theo thuật ngữ lập trình, bạn có thể tạo một đối tượng Person và khai báo một số biến (như tên và tuổi). Nếu bạn tạo một đối tượng Person thứ hai, đối tượng này có thể hỏi tuổi của đối tượng thứ nhất hoặc yêu cầu đối tượng thứ nhất bắt đầu đi. Nó có thể thực hiện những điều ấy bằng cách gọi đến các phương thức của đối tượng Person đầu tiên. Khi chúng ta bắt đầu viết mã lệnh bằng ngôn ngữ Java, bạn sẽ hiểu ngôn ngữ này triển khai thực hiện khái niệm đối tượng ra sao.

Nói chung, khái niệm đối tượng là như nhau trong ngôn ngữ Java và các ngôn ngữ hướng đối tượng khác, mặc dù việc triển khai thực hiện là khác nhau giữa các ngôn ngữ. Các khái niệm là phổ quát. Vì sự thật này, lập trình viên hướng đối tượng, bất chấp họ lập trình bằng ngôn ngữ nào, có xu hướng phát biểu khác so với những lập trình viên thủ tục. Các lập trình viên thủ tục thường nói về các hàm và các mô đun. Lập trình viên hướng đối tượng lại nói về các đối tượng và họ thường nói về các đối tượng này bằng cách sử dụng các đại từ nhân xưng. Chẳng hề bất thường khi bạn nghe một lập trình viên hướng đối tượng nói với đồng nghiệp, “đối tượng Supervisor nói với đối tượng Employee, ‘cho tôi ID của cậu,’” vì anh ta cần những thứ này để gán nhiệm vụ cho Employee.

Lập trình viên hướng thủ tục có thể nghĩ cách nói chuyện này thật lạ lùng, nhưng nó lại hoàn toàn bình thường đối với lập trình viên hướng đối tượng. Trong thế giới lập trình của họ, mọi thứ đều là đối tượng (cũng có một vài ngoại lệ đáng chú ý trong ngôn ngữ Java) và các chương trình là chỉ là sự tương tác (hay nói chuyện) giữa các đối tượng với nhau.

Các nguyên tắc hướng đối tượng cơ bản

Khái niệm đối tượng là trọng yếu đối với lập trình hướng đối tượng, và dĩ nhiên, ý tưởng các đối tượng giao tiếp với nhau bằng các thông điệp cũng vậy. Nhưng có 3 nguyên tắc cơ bản mà bạn cần hiểu.

Bạn có thể nhớ 3 nguyên tắc hướng đối tượng cơ bản bằng cụm viết tắt PIE:

  • Đa hình ( Polymorphism)
  • Thừa kế ( Inheritance)
  • Bao gói ( Encapsulation)

Đó là những từ trừu tượng nhưng những khái niệm này thực sự không quá khó hiểu. Trong các phần tiếp theo, chúng ta sẽ bàn về từng khái niệm này ở mức độ chi tiết hơn, theo thứ tự ngược lại.


Bao gói

Hãy nhớ rằng, một đối tượng là tự thân trọn vẹn, chứa đựng các thành phần dữ liệu và hành động mà nó có thể thực hiện trên các thành phần dữ liệu ấy. Đây là việc triển khai thực hiện nguyên lý gọi là ẩn giấu thông tin. Ý tưởng của nó là một đối tượng tự nó hiểu mình. Nếu một đối tượng khác muốn điều gì từ đối tượng này thì nó phải hỏi. Theo thuật ngữ lập trình hướng đối tượng, phải gửi một thông điệp đến một đối tượng khác để hỏi về tuổi. Theo thuật ngữ Java, phải gọi một phương thức của đối tượng khác để nó trả lại kết quả là tuổi.

Sự bao gói đảm bảo rằng mỗi đối tượng là khác nhau và chương trình là một cuộc chuyện trò giữa các đối tượng. Ngôn ngữ Java cho phép các lập trình viên vi phạm nguyên lý này nhưng hầu như luôn là một ý tưởng tồi nếu làm như thế.

Thừa kế

Khi bạn được sinh ra, nói về khía cạnh sinh học, bạn là tổ hợp DNA của cha mẹ mình. Bạn không hoàn toàn giống ai trong số họ, mà bạn giống cả hai người. OO cũng có nguyên tắc tương tự đối với các đối tượng. Quay lại với đối tượng Person. Ta nhớ lại rằng mỗi người có một chủng tộc. Không phải tất cả các Person đều cùng chủng tộc, nhưng dù sao thì họ cũng có điểm tương tự như nhau chứ? Chắc chắn vậy! Họ chẳng phải ngựa, tinh tinh hay cá voi mà là người. Mọi con người đều có những điểm chung nhất định và điều này giúp phân biệt con người với các loài động vật khác. Nhưng giữa mọi người cũng có khác biệt với nhau. Một đứa trẻ có giống hệt một người trưởng thành không? Không. Đi lại và nói là khác nhau rồi. Nhưng một đứa trẻ thì vẫn chắc chắn là một con người.

Theo ngôn ngữ hướng đối tượng, Person và Baby là các lớp sự vật hiện tượng thuộc cùng một hệ thống phân bậc, và Baby thừa kế các đặc tính và hành vi từ lớp cha của nó. Chúng ta có thể nói rằng một Baby cụ thể là một kiểu Person hay Baby thừa kế từ Person. Nhưng không có chiều ngược lại – một Person không nhất thiết phải là một Baby. Mỗi đối tượng Baby là một cá thể của lớp Baby và khi chúng ta tạo một đối tượng Baby, chúng ta cá thể hóa lớp này. Hãy coi lớp như là khuôn mẫu chung cho các cá thể của lớp đó. Nói chung, đối tượng có thể làm những gì tùy thuộc vào kiểu của đối tượng đó là gì – hoặc nói theo cách khác, đối tượng đó là cá thể của lớp nào. Cả Baby và Adult đều thuộc kiểu Person, nhưng một đối tượng (Adult) có thể có một việc làm (job) còn đối tượng kia (Baby) thì không.

Theo thuật ngữ Java, Person là một lớp bậc trên (superclass) của Baby và Adult, và các lớp này là lớp con của Person. Một khái niệm có liên quan khác là ý tưởng về trừu tượng hóa. Person có mức trừu tượng hóa cao hơn Baby hay Adult. Cả hai đều là kiểu Person nhưng có những khác biệt nho nhỏ. Tất cả các đối tượng Person đều có những điểm chung (như tên và tuổi). Bạn có thể cá thể hóa một Person? Thực sự là không! Bạn hoặc có một Baby hoặc có một Adult. Trong Java, Person được gọi là lớp trừu tượng. Bạn không thể trực tiếp có một cá thể của lớp Person. Bạn sẽ có Baby hoặc Adult, cả hai đều là kiểu Person, nhưng là Person đã được thực tế hóa. Các lớp trừu tượng nằm ngoài phạm vi của tài liệu này, chúng tôi sẽ không nói thêm về chúng nữa.

Bây giờ, ta hãy suy nghĩ xem với một Baby, “nói” (speak) có nghĩa là gì. Chúng ta sẽ xét đến các hệ quả trong phần thảo luận tiếp theo.

Đa hình

Baby có “nói” như Adult không? Dĩ nhiên là không rồi. Một Baby có thể ê a, nhưng không nhất thiết nói ra những lời hiểu được như Adult. Do đó, nếu tôi cá thể hóa một đối tượng Baby (hay là “cá thể hóa một Baby” cũng có cùng ý nghhĩa – từ “đối tượng” được ngầm hiểu) và cho nó nói, thì nó chỉ có nghĩa là những tiếng ê a. Ta hy vọng rằng Adult “nói” thì mạch lạc hơn.

Trong hệ thống phân bậc con người, chúng ta có Person nằm ở đỉnh với Baby và Adult nằm phía dưới nó, là các lớp con. Tất cả mọi người đều có thể nói, Baby và Adult cũng vậy, nhưng sẽ nói khác nhau. Baby chỉ ê a và phát những âm thanh đơn giản. Adult nói thành lời. Đó chính là sự đa hình: các đối tượng làm việc theo cách riêng của chúng.

Ngôn ngữ Java là (và không là) OO ở chỗ nào?

Như chúng ta sẽ thấy, ngôn ngữ Java cho phép bạn tạo các đối tượng hạng nhất (first-class), nhưng không phải bất cứ cái gì trong ngôn ngữ này đều là đối tượng. Một số ngôn ngữ OO như Smalltalk lại hoàn toàn khác. Smalltalk hoàn toàn là OO, có nghĩa là mọi thứ trong ngôn ngữ này đều là đối tượng. Java là ngôn ngữ lai tạp giữa đối tượng và phi đối tượng. Nó cho phép một đối tượng biết rõ các đối tượng khác, nếu với tư cách là một lập trình viên bạn cho phép điều đó xảy ra. Điều này vi phạm nguyên lý bao gói.

Tuy nhiên, ngôn ngữ Java cũng cung cấp cho tất cả các lập trình viên OO những công cụ cần thiết để tuân theo mọi quy tắc OO và viết mã lệnh OO rất chuẩn. Nhưng làm được như vậy cần phải tự có kỷ luật. Ngôn ngữ không ép bạn làm việc đúng đắn được.

Trong khi những người thuần túy chủ nghĩa hướng đối tượng tranh luận xem liệu Java là hướng đối tượng hay không, thực sự đây không phải là một lý lẽ mang lại ích lợi. Nền tảng Java sẽ giữ vững vị trí của nó. Hãy học cách lập trình hướng đối tượng tốt nhất có thể với mã lệnh Java và cứ để những lý lẽ thuần túy chủ nghĩa cho những người khác. Ngôn ngữ Java giúp bạn viết chương trình rõ ràng, khá ngắn gọn, dễ bảo trì, điều này là khá đủ trong cuốn sách của tôi đối với hầu hết các tình huống nghề nghiệp.

Saturday, October 24, 2009

Vài nét về ngôn ngữ Java

VÀI NÉT VỀ NGÔN NGỮ JAVA

Java là một ngôn ngữ lập trình do công ty Sun Microsystems phát triển vào đầu thập kỷ 1990. Xuất phát điểm của ngôn ngữ này là một dự án nghiên cứu của công ty trong đó lúc đầu các nhà nghiên cứu dùng C++. Ngay sau đó nhóm nghiên cứu đã cho rằng họ cần một thứ gì đó tốt hơn thế. Các nhà nghiên cứu này đều là các lập trình viên xuất sắc, do vậy họ đã bắt tay ngay vào việc xây dựng một ngôn ngữ lập trình mới bằng cách tận dụng các ý tưởng hay của các ngôn ngữ lập trình khác. Người thiết kế Java là ông James Gosling còn nhà lập trình triển khai phiên bản chương trình dịch Java công cộng đầu tiên là ông Arthur van Hoff. Thoạt đầu người ta đặt tên cho ngôn ngữ này là "Oak", thực ra chỉ là một cái tên không có ý nghĩa gì đặc biệt. Tên gọi "Java" là do nhà tiếp thị Kim Polese đặt cho ngôn ngữ này hàm ý những đặc điểm phong phú và thú vị của nó.

Vì Java xuất phát từ một dự án nghiên cứu chứ không phải là một sản phẩm nhằm mục đích sinh lời, công ty Sun đã đồng ý đưa Java Development Kit (bộ công cụ phát triển Java, bao gồm chương trình dịch và hệ thống đáp ứng chạy chương trình) lên Internet miễn phí vào khoảng giữa năm 1995. Trong vòng 6 tháng kể từ khi công bố miễn phí, Java đã được hơn một trăm ngàn người lập trình sử dụng. Hai năm sau, đã có tới hơn bốn trăm ngàn nhà phát triển phần mềm Java. Vì Java chạy khắp mọi nơi, tổng thị phần tiềm tàng cho toàn bộ các nhà lập trình này là trên 250 triệu hệ thống máy tính trên thế giới. Có thể nói rằng không có một ngôn ngữ nào trong quá khứ gặt hái được nhiều thành tích trong một thời gian ngắn như vậy. Tuy nhiên, do tốc độ chấp nhận Java quá nhanh, đôi khi bạn cũng có thể thấy những ý kiến cho rằng có sự "khuyếch trương quá đáng" về Java. Cũng dễ hiểu là đôi khi một phát triển mới thường gây sự chú ý vì nó thực sự tốt hơn những cái khác trong quá khứ.

Với Java, bạn sẽ có dịp tiếp cận với một trong những sự phát triển kỳ thú nhất của ngành công nghiệp phần mềm.

Hệ thống Java bao gồm một số cấu phần như sau:

- Ngôn ngữ lập trình Java
- Java Virtual Machine (Máy o Java, bộ thông dịch)
- Các thư viện phần mềm đi kèm hệ thống
- chương trình duyệt web HotJava hoặc chương trình duyệt web khác thích ứng với Java

Bạn đọc cũng nên lưu ý rằng có một số phần mềm bao hàm tên Java nhưng chỉ liên quan ngoài lề với Java. Chẳng hạn như JavaScript. Ðây là ngôn ngữ chỉ lệnh (script language) do Netscape Communications Corporation xây dựng. JavaScript được dùng trong chương trình duyệt Netscape để nhắc người sử dụng nhập, đọc thông tin, mở và đóng các cửa sổ phụ trợ v.v. JavaScript hỗ trợ khả năng lập trình cơ bản của chương trình duyệt nhưng không phải là một ngôn ngữ ứng dụng vạn năng như Java. Với việc xây dựng hỗ trợ Java trong Netscape Navigator 2.0, Netscape đã giúp cho việc phổ biến rộng rãi Java. Ðổi lại, Netscape được Sun cho phép dùng tên Java cho ngôn ngữ chỉ lệnh của họ. JavaScript chẳng liên quan gì tới Java, vì vậy để trở thành người lập trình Java bạn không cần phải học JavaScript. Dĩ nhiên nếu bạn đã biết JavaScript rồi thì cũng không sao.

Ngôn ngữ Java

Thực ra Java không đưa ra nhiều ý tưởng hoàn toàn mới mà sự đổi mới ở đây là việc gom lại các ý tưởng hay nhất của các hệ thống đi trước. Java là một ngôn ngữ lập trình hướng đối tượng trong cùng một họ như C++, Pascal hay Algol-60. Các chương trình Java có các mô tả dữ liệu và các câu lệnh nhóm lại trong các hàm (do Java là một ngôn ngữ lập trình hướng đối tượng, các hàm của nó thường được gọi là các "phương pháp" (method). Các phương pháp có thể gọi tới các phương pháp khác. Sự thực hiện chương trình sẽ được bắt đầu với một phương pháp có tên đặc biệt là main().

Java nhanh chóng được nhiều nhà lập trình công nhận. Các câu lệnh và các biểu diễn tương tự như trong nhiều ngôn ngữ và trong nhiều trường hợp là đồng nhất như trong C hoặc C++. Mặc dù Java đã bổ sung một số điểm mới, nét phân biệt nhất của Java lại là những đặc điểm mà nó bỏ qua. Chẳng hạn, so sánh với C, Java không có

- Số học địa chỉ bộ nhớ (con trỏ)
- Bộ tiền xử lý
- Câu lệnh goto
- Chuyển đổi kiểu tự động
- Các biến và hàm tổng thể
- Các định danh xác định kiểu.

Còn so với C++ thì Java không có

- Các mẫu (template - tuy nhiên người ta đang tính đến việc bổ sung đặc điểm này cho Java)
- Quá tải toán tử (operator overloading)
- Ða thừa kế
- Ða ABI (Application Binary Interface, giao diện nhị phân ứng dụng)

Nếu bạn không phải là người lập trình C++ và bạn không biết một số những khái niệm trên thì cũng không hề gì. Ngay cả một người lập trình C++ cũng không nhất thiết đã thành thạo tất cả những khía cạnh này. Với Java bạn không cần phải biết tới chúng.

Tới đây, có lẽ bạn cũng muốn biết liệu Java có thay thế C++ hay không. Trên thực tế có thể nói rằng Java đang "cạnh tranh" với C++ trên phương diện ngôn ngữ đầu tiên được xem xét đến để phát triển các ứng dụng mới. Tuy nhiên, các ngôn ngữ lập trình mức cao không bao giờ thực sự mất đi cả. C++ sẽ vẫn còn trong một thời gian nữa đối với các ứng dụng riêng. Có 3 lý do về việc người ta sẽ tiếp tục lập trình với C++ là:

- Tính tương thích với mã hiện tại
- Không cần đào tạo lại cán bộ liên quan
- Có sẵn nhiều công cụ tốt hơn (nhanh hơn)

Trong các lý do nêu trên, lý do đầu tiên sát với thực tế về việc bảo trì mã chương trình bằng C++, nhưng có lẽ cũng chỉ xác đáng cho một thời gian ngắn nữa. C++ đã đạt tới đỉnh điểm và nay nó sẽ duy trì ở mức đó hoặc đi xuống. Tổ hợp C và Java sẽ không để cho C++ có địa vị dài hạn nữa.

Máy ảo Java (Java Virtual Machine)

Mã nguồn Java được biên dịch để sinh ra mã đối tượng gọi là bytecode (mã byte). Nếu chỉ có thế thôi thì cũng chẳng có gì khác với các ngôn ngữ khác. Ðiều khác nhau căn bản ở đây là bytecode không phải là mã nhị phân của bất kỳ máy tính đang tồn tại thực tế nào mà đó là một loại mã máy kiến tạo - trung gian có thể dễ dàng dịch sang để chạy trên bất kỳ máy tính cụ thể nào. Bạn sẽ thực hiện một chương trình Java bằng cách chạy một chương trình khác gọi là Java Virtual Machine hay là JVM. Thông thường trong hầu hết các môi trường hiện tại JVM được gọi thực hiện bằng một chương trình có tên là java. JVM đọc chương trình bằng bytecode và thông dịch hoặc biên dịch nó ra theo hệ lệnh thực tế.

Ðây là một đặc điểm có ý nghĩa rất lớn. Chạy bytecode trên một JVM là lý do vì sao các phần mềm Java là "viết một lần, chạy khắp nơi". Các chương trình chạy được Java (Java executable) cung cấp một bộ mã nhị phân chạy trên mọi bộ xử lý. Nói cách khác, một ứng dụng bằng Java của bạn chẳng hạn là chương trình xyz nào đó bằng Java sẽ chạy trên mọi hệ thống hỗ trợ Java mà không cần phải có riêng "xyz cho DOS", "xyz cho Windows 3.1", "xyz cho Windows 95"...

Tính dễ chuyển mang và tính năng của phần mềm

Tính dễ chuyển mang của phần mềm là khuynh hướng lý tưởng của ngành công nghệ phần mềm. Nó đã được nghiên cứu, tìm kiếm từ lâu nay nhưng chưa bao giờ thực sự đạt được. Java làm cho ngành công nghệ này tiến lại gần tính dễ chuyển mang của phần mềm nhiều hơn tất cả các hệ thống trước đó. Tại các cửa hàng bán phần mềm hiện nay, có lẽ bạn sẽ thấy chủ yếu là các phần mềm dùng cho Windows (một số chỉ cho Windows 3.1, một số cho cả Windows 95 và Windows 3.1), một số ít cho Mac và một số rất ít (có thể là không có) cho Unix. Khi Java trở thành ngôn ngữ phổ biến thì bạn có thể chọn từ tất cả các phần mềm có trong cửa hàng và phần mềm bạn chọn mua sẽ chạy trên tất cả các hệ thống máy tính mà bạn có. Lúc đó mọi người có được sự lựa chọn rộng rãi hơn và giá phần mềm cũng sẽ hạ do các nhà cung ứng phần mềm có thể phân bổ chi phí phát triển trên một thị trường rộng lớn 250 triệu máy tính chứ không phải chỉ cho 91 triệu hệ thống Windows 3.1 hoặc cho 20 triệu hệ thống Macintosh hoặc cho 8 triệu hệ thống Unix.

Máy ảo Java (chẳng qua chỉ là một cái tên mỹ miều cho bộ thông dịch) phải được triển khai cho mỗi hệ thống máy tính và sau đó mọi bytecode sẽ chạy được trên hệ thống đó. Ðiểm quan trọng ở đây là bytecode có khả năng chuyển mang tổng hợp. Ðương nhiên vấn đề đặt ra là làm sao để có các JVM thích hợp cho từng môi trường. Có lẽ vấn đề này cũng tương tự như quá trình để cho các máy tính cá nhân (PC) là tương thích DOS trước đây.

Một điều lý thú là bytecode không phải chỉ dành riêng cho Java. Nếu bạn sửa đổi một chương trình dịch đối với một số ngôn ngữ khác như Ada hay Visual Basic để nó sinh ra được bytecode thì bạn cũng có thể chạy bytecode đó "ngon lành" trên JVM trên bất kỳ máy tính nào. Ðây là một hướng mà các nhà cung ứng phần mềm đang quan tâm. Khả năng chạy được mã của bạn trên mọi hệ thống máy tính trên hành tinh là lý do mạnh mẽ để cải cách. ý tưởng về JVM hỗ trợ đắc lực cho hướng cải cách này.

Java có những đảm bảo tính dễ chuyển mang, bao gồm việc cung cấp cùng một giao diện người lập trình ứng dụng (API, Application Programmer Interface) trên mọi loại nền; cùng một giao diện nhị phân ứng dụng (ABI, Application Binary Interface), cụ thể là máy ảo Java, trên mọi loại nền. Ngoài ra ngôn ngữ Java còn có qui định bắt buộc một số điểm lâu nay vẫn để tuỳ thuộc vào sự cụ thể hoá của người viết chương trình dịch. Bằng cách yêu cầu rằng các toán hạng được đánh giá theo thứ tự nghiêm ngặt từ trái qua phải và qui định kích thước của tất cả các kiểu cơ bản (kiểu nguyên là 32 bit, kiểu chính xác gấp đôi là 64 bit v.v) Java đáp ứng không những tính dễ chuyển mang mà còn cả cách xử lý đồng nhất của chương trình trên các hệ thống khác nhau. Java dùng Unicode là tập ký tự chuẩn có thể biểu diễn các ký hiệu, ký tự trong hầu hết các bảng chữ cái trên thế giới, kể cả các ký tự tiếng Việt cũng như các loại chữ tượng hình của châu A'. Trong thời gian sắp tới, nếu chuẩn tiếng Việt cho công nghệ thông tin của Việt nam dựa trên Unicode thì chắc chắn Java dễ dàng hỗ trợ cho chuẩn đó.

Một điều có thể dễ nhận thấy rằng việc bảo đảm tính dễ chuyển mang có thể ảnh hưởng tới tính năng thực hiện của phần mềm. Tuy nhiên, ta có một sự cân nhắc đáng giá. Bạn hãy hình dung xem, nếu tất cả các hệ thống được xây dựng trong nhiều năm qua không cố gắng tiết kiệm chi phí của hai byte "thừa" và lưu giữ các con số năm bằng 4 byte chứ không phải là 2 byte thì chúng ta đã không gặp phải sự cố đau đầu "vấn đề năm 2000" . Với Java, có thể bạn thấy một số điểm là hơi "cồng kềnh" hoặc "dư thừa". Tuy nhiên, những qui định chặt chẽ và chuẩn hoá của Java chính là để đảm bảo tính dễ chuyển mang và tính năng của nó trong một tương lai dài lâu.

Java với việc quản lý bộ nhớ

Trong lập trình, một vấn đề rất nặng nề được đặt ra là việc quản lý bộ nhớ động, trong đó có việc "dọn dẹp bộ nhớ" - tức là việc giải phóng những phần bộ nhớ mà chương trình đã dùng xong để dành cho những mục đích khác. Khi một chương trình chạy, nó sẽ phân bổ bộ nhớ để lưu giữ các đối tượng mới. Khi sự tồn tại của các đối tượng này đã kết thúc thì không gian bộ nhớ dành cho chúng cần được giải phóng và dùng lại cho các đối tượng khác. Nếu bộ nhớ không được giải phóng thì quá trình (chương trình) sẽ ngày càng lớn lên và sẽ có thể chiếm hết tất cả không gian nhớ, gây tràn. Một số ngôn ngữ như COBOL-74 không trang bị khả năng quản lý bộ nhớ động (do vậy một số chương trình hết sức khó viết hoặc không thể viết được). Một số ngôn ngữ khác như Pascal, C, C++ lại trút gánh nặng quản lý bộ nhớ lên vai người lập trình. Thậm chí người lập trình còn phải quan tâm xem phần nào của bộ nhớ đang được sử dụng và phải giải phóng phần nào của bộ nhớ khi cần thiết. Những chuyện này dẫn đến nhiều loại lỗi khác nhau của các chương trình, phổ biến là lỗi không giải phóng được bộ nhớ gây ra các "lỗ hổng" không bao giờ được khai báo lại trong bộ nhớ. Còn tệ hơn là các lỗi gây ra do việc cố giải phóng những phần bộ nhớ còn đang sử dụng dẫn đến hỏng hoặc mất dữ liệu.

Các chương trình Java được quản lý về bộ nhớ ở mức hệ thống và người lập trình không bao giờ phải lo lắng về chuyện đó. Thư viện thời gian chạy của Java sẽ giám sát các cấu trúc dữ liệu. Khi không còn một tham chiếu nào tới một cấu trúc dữ liệu thì nó không thể là đang được sử dụng vì chương trình không có cách gì để đọc hoặc ghi nó. Lúc đó nó sẽ là đối tượng của việc dọn dẹp bộ nhớ.

Java hướng tới việc dọn dẹp bộ nhớ tự động. Việc dọn dẹp bộ nhớ tự động ảnh hưởng tới tính năng vì nó liên quan đến các quá trình khác chạy trong nền sau để giám sát việc sử dụng bộ nhớ. Tuy nhiên thực tế đã chỉ ra rằng, ở đây cũng có một sự cân nhắc đáng giá. Một hệ thống nhỏ thực hiện dọn dẹp bộ nhớ tự động đã dẫn tới sự cải thiện rất lớn thông qua việc gỡ bỏ một loạt các lỗi của các chương trình Java. Có thể so sánh, các chương trình C++ chịu trách nhiệm quản lý các đống (heap) bộ nhớ của riêng chúng do vậy chúng phải có mã dài hơn, mất nhiều thời gian gỡ rối hơn và các chương trình lớn thường dẫn tới các lỗi rất khó phát hiện và xử lý về việc dọn dẹp bộ nhớ.

Java và WWW (World Wide Web)

Có hai loại chương trình Java: chương trình đơn lẻ, gọi là các ứng dụng, và chương trình chạy trong các trình duyệt web, gọi là các applet. Một applet đơn thuần là một chương trình ứng dụng chạy bên trong một chương trình duyệt. Có rất ít khác biệt giữa lập trình ứng dụng và lập trình applet. Trên thực tế cùng một bộ mã nhị phân có thể đồng thời là cả hai thứ đó. Ðiều này có nghĩa là tất cả những kiến thức và kỹ năng lập trình ứng dụng Java cũng áp dụng được cho lập trình applet Java và ngược lại..

Applet hoạt động giống như cung cách bạn đặt một trang web với các siêu văn bản trên một server và một máy khách (client) có thể tải trang đó xuống theo yêu cầu để xem các văn bản đã sắp đặt theo khuôn dạng. Tương tự, bạn viết và biên dịch một chương trình applet Java và đặt một tham chiếu URL hoặc HTML tới nó trong trang web. Khi một client duyệt qua trang web này, mã nhị phân của applet Java được tải xuống client đó cùng các tệp văn bản và đồ hoạ. chương trình duyệt chứa một JVM và nó sẽ thực hiện applet trên máy tính của client.

Ðiều mô tả ở trên nghe có vẻ giản đơn và có lẽ cũng chẳng có gì thú vị nhưng thực tế nó đã làm sôi động cả ngành công nghệ máy tính. Trước Java, WWW là giao diện chỉ đọc (read-only interface). Bạn duyệt và trình duyệt phục vụ bạn đọc các trang, chỉ có thế thôi. Nay các trang web có thể làm cho các chương trình được chạy và chương trình duyệt ngày càng trở nên giao diện máy tính vạn năng. Thoạt tiên, các applet được coi là các ứng dụng nhỏ nhưng trên thực tế không có hạn chế nào về kích thước cuả các applet cả. Do chỗ mô hình này rất tiện lợi nên hiên nay đã có các applet đủ các kích cỡ.

Các applet hết sức phù hợp với mô hình xử lý khách - chủ. Bằng cách viết chương trình Java của mình như là một applet bạn có thể đưa nó vào một trang web và cho phép mọi người, với mọi loại máy tính ở mọi nơi trên mạng intranet của bạn truy nhập và thực hiện nó một cách tự động mà không phải cài đặt một cái gì cả. Khi nâng cấp hoặc thay đổi applet của mình bạn chỉ việc đưa phiên bản mới của applet lên trang web và thế là trong lần truy nhập sau đó các client sẽ được cập nhật một cách tự động. Các vấn đề đau đầu liên quan đến phân phối phần mềm như làm thế nào để cài đặt hay cập nhật các phiên bản cho một loạt các máy tính có thể giải quyết dễ dàng theo cách này.