CNTT - Tin học Nhập môn lập trình Java

Thảo luận trong '2. Thế giới số' bắt đầu bởi MinhThy, 27 Tháng tám 2010.

  1. MinhThy R.L.G

    Ngôn ngữ Java, và nền tảng Java luôn phát triển là một cuộc cách mạng trong lập trình. Mục tiêu của hướng dẫn này là giới thiệu cho bạn cú pháp của Java mà bạn hầu như chắc chắn sẽ gặp trên con đường nghề nghiệp và cho bạn thấy những thành tố đặc thù (idioms) của nó giúp bạn tránh khỏi những rắc rối. Theo bước Roy Miller, chuyên gia Java khi ông hướng dẫn bạn những điểm cốt yếu của lập trình Java, bao gồm mẫu hình hướng đối tượng (OPP) và cách thức áp dụng nó vào lập trình Java; cú pháp của ngôn ngữ Java và cách sử dụng; tạo ra đối tượng và thêm các hành vi, làm việc với các sưu tập (collections), xử lý lỗi; các mẹo để viết mã lệnh tốt hơn.

    Về tài liệu này

    Tài liệu đề cập đến những gì?

    Hướng dẫn này giới thiệu cho bạn phương pháp lập trình hướng đối tượng (OOP) bằng ngôn ngữ Java. Nền tảng Java là một chủ đề rộng lớn, bởi vậy chúng ta không thể đề cập đến tất cả trong tài liệu này, nhưng chúng ta sẽ trình bày đủ để bạn có thể khởi đầu. Tài liệu tiếp theo sẽ cung cấp thêm các thông tin và hướng dẫn bạn trong nỗ lực lập trình bằng Java.

    Ngôn ngữ Java tất nhiên có cả ưu và nhược điểm, nhưng ảnh hưởng của nó đến ngành công nghiệp phát triển phần mềm là không thể chối cãi. Mặt tốt là ngôn ngữ Java gây ít khó khăn hơn so với C++. Java giảm bớt một số nhiệm vụ lập trình phiền phức, như quản lý tường minh bộ nhớ, và cho phép người lập trình tập trung vào logic nghiệp vụ. Mặt kém của nó, theo những người thuần túy chủ nghĩa hướng đối tượng, là Java có quá nhiều tàn dư phi đối tượng để được coi là một công cụ tốt. Tuy nhiên, bất kể vị trí của bạn như thế nào thì biết cách sử dụng ngôn ngữ này như một công cụ khi nó là công cụ thích hợp nhất phục vụ cho công việc của bạn vẫn là một lựa chọn nghề nghiệp sáng suốt.

    Tôi nên đọc tài liệu này không chứ?


    Nội dung của tài liệu hướng dẫn này nhằm đến những người mới bắt đầu lập trình Java, những người có thể chưa quen với các khái niệm lập trình hướng đối tượng hoặc đặc biệt là chưa quen với nền tảng Java. Nó coi như người đọc đã có kiến thức chung để tải về và cài đặt phần mềm, kiến thức chung về lập trình và cấu trúc dữ liệu (như mảng), nhưng không yêu cầu nhiều hơn việc làm quen sơ qua với lập trình hướng đối tượng.

    Tài liệu này sẽ hướng dẫn bạn từ việc thiết lập nền Java trên máy của bạn, cài đặt và làm việc với Eclipse, một môi trường phát triển tích hợp (IDE) miễn phí để viết mã Java. Từ điểm này trở đi, bạn sẽ học những điều căn bản của lập trình Java, bao gồm mẫu hình lập trình hướng đối tượng và cách áp dụng nó vào lập trình Java; cú pháp và cách dùng ngôn ngữ Java; tạo ra các đối tượng và thêm các hành vi, làm việc với các sưu tập, xử lý lỗi; các mẹo để viết mã lệnh tốt hơn. Sau khi học hết tài liệu này, bạn sẽ trở thành một lập trình viên Java – một lập trình viên Java khởi đầu, nhưng dù sao vẫn là một lập trình viên Java.

    Các yêu cầu về phần mềm

    Để chạy các ví dụ hoặc các đoạn mã mẫu trong hướng dẫn này, bạn sẽ cần có Java 2 Platform, Standard Edition (J2SE), phiên bản 1.4.2 hoặc mới hơn, và máy của bạn phải cài IDE Eclipse. Đừng lo nếu bạn còn chưa cài đặt những gói này – chúng tôi sẽ chỉ cho bạn cách làm trong phần khởi động. Tất cả ví dụ mã lệnh trong hướng dẫn này được kiểm thử với J2SE 1.4.2 chạy trên nền Windows XP. Tuy nhiên, một điều tuyệt vời của nền tảng Eclipse là nó chạy trên hầu hết các hệ điều hành mà có khả năng bạn đang dùng, bao gồm Windows 98/ME/2000/XP, Linux, Solaris, AIX, HP-UX, và thậm chí cả Mac OS X.



    Còn tiếp ....

    Nguồn IBM
  2. MinhThy R.L.G

    Khởi động

    Các chỉ dẫn cài đặt

    Trong mấy phần tiếp theo, tôi sẽ hướng dẫn bạn qua từng bước tải về và cài đặt Java 2 Platform Standard Edition (J2SE), phiên bản 1.4.2 và IDE Eclipse. Nền Java giúp bạn dịch và chạy chương trình Java. Còn IDE Eclipse mang lại cho bạn công cụ hùng mạnh và thân thiện với người sử dụng để viết mã lệnh bằng ngôn ngữ Java. Nếu bạn đã cài đặt Java SDK và Eclipse, hãy vui lòng chuyển ngay sang phần Tìm hiểu nhanh về Eclipse hoặc mục tiếp theo, Các khái niệm lập trình hướng đối tượng, nếu bạn cảm thấy thuận tiện.

    Cài đặt Java SDK

    Mục đích ban đầu của ngôn ngữ Java là cho phép các lập trình viên viết một chương trình để chạy trên bất cứ nền tảng nào, một ý tưởng gói gọn trong cụm từ “Viết một lần, chạy bất cứ đâu” (WORA). Trong thực tế, điều này hoàn toàn không đơn giản, nhưng nó đang trở nên dễ dàng hơn. Nhiều thành phần khác nhau trong công nghệ Java hỗ trợ cho nỗ lực này. Java có 3 ấn bản, ấn bản chuẩn (Standard), ấn bản doanh nghiệp (Enterprise), và ấn bản di động (Mobile), hai ấn bản sau tương ứng dành cho việc phát triển ứng dụng doanh nghiệp và thiết bị cầm tay. Chúng ta sẽ làm việc với J2SE, bao gồm tất cả các thư viện lõi của Java. Tất cả những gì bạn cần làm là tải về và cài đặt.

    Để tải về bộ phát triển phần mềm J2SE (J2SE SDK), làm theo các bước sau:

    1. Mở trình duyệt và đi đến trang chủ Công nghệ Java. Tại giữa đầu trang bạn sẽ thấy nhiều đường kết nối đến các vùng chủ đề công nghệ Java khác nhau. Chọn J2SE (Core/Desktop).

    2. Trong danh sách các bản phát hành J2SE hiện tại, chọn J2SE 1.4.2.

    3. Tại cột dẫn hướng bên trái của trang kết quả, nhấp chuột vào Downloads.

    4. Có một vài liên kết tải về trên trang này. Tìm và nhấp chọn liên kết Download J2SE SDK.

    5. Chấp nhận các điều kiện về giấy phép sử dụng và nhấp chọn Continue.

    6. Bạn sẽ thấy một danh sách các gói tải về theo từng nền hệ điều hành. Chọn gói tải về thích hợp với bất cứ nền hệ điều hành nào mà bạn đang dùng.

    7. Ghi lưu tệp vào ổ cứng của bạn.

    8. Khi tải về xong, chạy chương trình cài đặt để cài đặt SDK trên ổ cứng của bạn, nên chọn thư mục có tên thích hợp ngay trong thư mục gốc của ổ cứng.

    Tuyệt! Bây giờ bạn đã có môi trường Java trên máy mình. Bước tiếp theo là cài đặt môi trường phát triển tích hợp (IDE).
  3. MinhThy R.L.G

    Cài đặt Eclipse

    Môi trường phát triển tích hợp (IDE) che giấu đi nhiều chi tiết công nghệ trần tục trong khi làm việc với ngôn ngữ Java, do đó bạn có thể tập trung vào viết và chạy mã lệnh. Bộ JDK mà bạn vừa cài đặt bao gồm vài công cụ dòng lệnh cho phép bạn biên dịch và chạy các chương trình Java mà không cần có IDE, nhưng sử dụng những công cụ này nhanh chóng trở nên rất vất vả chỉ trừ những chương trình đơn giản nhất. Sử dụng một IDE che giấu đi nhiều chi tiết sẽ mang lại cho bạn những công cụ mạnh để giúp bạn lập trình nhanh hơn và tốt hơn, và đơn giản nó là một cách lập trình rất dễ chịu.

    Không còn cần thiết phải trả tiền để mua một IDE tuyệt hảo. IDE Eclipse là một dự án nguồn mở và nó là của bạn, tải về miễn phí. Eclipse lưu trữ và theo dõi mã lệnh Java của bạn trong những tệp dữ liệu dễ đọc nằm trong hệ thống tệp của bạn. (Bạn cũng có thể dùng Eclipse để làm việc với mã lệnh trong kho CVS). Tin tốt lành là Eclipse để bạn làm việc với tệp nếu bạn muốn, nhưng nó ẩn giấu đi chi tiết về tệp nếu bạn chỉ muốn làm việc với các cấu trúc Java khác như các lớp chẳng hạn (ta sẽ thảo luận chi tiết sau).

    Việc tải về và cài đặt Eclipse rất đơn giản. Hãy làm theo những bước sau:

    1. Mở trình duyệt và đi đến trang web của Eclipse.

    2. Nhấn chọn đường liên kết Downloads ở bên trái của trang.

    3. Nhấn chọn đường liên kết Main Eclipse Download Site để vào trang tải về của dự án Eclipse.

    4. Bạn sẽ thấy một danh sách các kiểu xây dựng (build types) và tên. Chọn mục 3.0.

    5. Ở giữa trang, bạn sẽ thấy một danh sách các SDK Eclipse tùy theo nền hệ điều hành; chọn cái thích hợp với hệ thống của bạn.

    6. Ghi lưu tệp vào ổ cứng.

    7. Khi tải về xong, chạy trình cài đặt và cài đặt Eclipse vào ổ cứng của bạn, nên chọn thư mục có tên thích hợp ngay trong thư mục gốc của ổ cứng.

    Tất cả những việc còn lại bây giờ là thiết đặt IDE.
  4. MinhThy R.L.G

    Thiết đặt Eclipse

    Để dùng Eclipse viết mã Java, bạn phải cho Eclipse biết vị trí Java ở đâu trên máy của bạn. Hãy làm theo các bước sau:

    1. Khởi chạy Eclipse bằng cách nhấn đúp chuột vào tệp eclipse.exe, hoặc tệp chạy thi hành tương đương trên hệ điều hành của bạn.

    2. Khi màn hình Welcome xuất hiện, nhấn đường liên kết Go To The Workbench. Thao tác này sẽ đưa bạn đến bối cảnh tài nguyên (sẽ đề cập chi tiết sau).

    3. Nhấn chọn Window>Preferences>Installed JREs, thao tác này cho phép bạn chỉ rõ vị trí nơi môi trường Java đã được cài đặt vào máy bạn (xem hình 1).

    Hình 1. Các lựa chọn ưu tiên của Eclipse

    [IMG]

    4. Nhiều khả năng là Eclipse sẽ tìm thấy JRE đã cài đặt sẵn, nhưng bạn nên chỉ rõ ràng đến JRE mà bạn đã cài trong mục Cài đặt Java SDK. Bạn có thể làm điều đó trong hộp thoại Preferences (các lựa chọn ưu tiên). Nếu Eclipse liệt kê một JRE đang có sẵn, nhấn chuột chọn nó và nhấn Edit, trái lại, nhấn Add.

    5. Chỉ rõ đường dẫn đến thư mục JRE của JDK mà bạn đã cài trong mục Cài đặt Java SDK.

    6. Nhấn OK.

    Bây giờ thì Eclipse đã được thiết đặt để biên dịch và chạy mã lệnh Java. Trong phần tiếp theo chúng ta sẽ đi một vòng xem qua môi trường Eclipse để bạn làm quen với công cụ này.
  5. MinhThy R.L.G

    Một vòng xem qua Eclipse

    Làm việc với Eclipse là một chủ đề lớn và hầu như vượt ra ngoài phạm vi của tài liệu hướng dẫn này. Xem phần Các tài nguyên để có thêm thông tin về Eclipse. Ở đây, chúng ta sẽ chỉ trình bày vừa đủ để bạn làm quen với cách làm việc của Eclipse và sử dụng nó để lập trình Java như thế nào.

    Giả sử bạn vẫn có Eclipse đang chạy, bạn ngừng xem phần phối cảnh Tài nguyên. Eclipse cung cấp một tập các phối cảnh trên mã lệnh bạn viết. Phối cảnh Tài nguyên (Resource) sẽ hiển thị một khung nhìn hệ thống tệp tin của bạn trong vùng làm việc (workspace) Eclipse mà bạn đang sử dụng. Một vùng làm việc giữ tất cả các tệp liên quan đến việc phát triển trong Eclipse. Bây giờ thì chưa có gì trong vùng làm việc của bạn để bạn phải thực sự quan tâm.

    Nhìn chung, Eclipse có các phối cảnh, chứa các khung nhìn. Trong phối cảnh Tài nguyên, bạn sẽ thấy có khung nhìn Navigator, khung nhìn Outline, … Bạn có thể kéo thả tất cả những khung nhìn này vào vị trí bất kỳ bạn muốn. Nó là môi trường tùy biến hầu như vô hạn. Thế nhưng bây giờ, những xếp đặt mặc định cũng đủ tốt. Nhưng những gì chúng ta thấy chưa cho phép ta làm những gì ta muốn. Bước đầu tiên để viết mã lệnh Java trong Eclipse là tạo một dự án Java. Đây không phải là một cấu trúc ngôn ngữ Java; nó đơn giản là một cấu trúc Eclipse giúp bạn tổ chức mã lệnh Java của mình. Làm theo các bước sau để tạo dự án Java:

    1. Nhấn chuột vào File>New>Project để hiển thị cửa sổ thủ thuật tạo dự án mới (New Project wizard - xem hình 2). Đây thực sự là một trình thủ thuật của thủ thuật, cho phép bạn lựa chọn sử dụng thủ thuật nào bạn muốn (thủ thuật New Project, thủ thuật New File, vân vân).

    Hình 2. Trình thủ thuật mở một dự án mới

    [IMG]

    2. Hãy đảm bảo là bạn chọn thủ thuật Java Project và nhấn Next.

    3. Nhập bất kỳ tên dự án nào bạn muốn (tên “Intro” có thể là một gợi ý hay), giữ nguyên các lựa chọn mặc định và nhấn Finish.

    4. Ở bước này, Eclipse sẽ hỏi bạn liệu có nên chuyển sang phối cảnh Java không. Nhấn chọn No.

    Bạn vừa tạo một dự án Java có tên là Intro, bạn sẽ phải nhìn thấy nó trong khung nhìn Navigator ở góc trên bên trái của màn hình. Chúng ta sẽ không chuyển sang phối cảnh Java sau khi tạo dự án vì có một phối cảnh tốt hơn để dùng cho những mục đích hiện tại của chúng ta. Nhấn nút Open Perspective trên phiếu nằm ở góc trên bên phải của cửa sổ, sau đó chọn phối cảnh Java Browsing. Phối cảnh này sẽ hiển thị cho bạn những gì bạn cần thấy để dễ dàng viết một chương trình Java. Khi viết mã lệnh Java, ta sẽ duyệt qua một vài đặc tính Eclipse nữa để bạn có thể học cách viết, sửa đổi và quản lý mã lệnh của mình. Tuy nhiên, trước khi thực hiện điều này, chúng ta phải trình bày một vài khái niệm cơ bản về lập trình hướng đối tượng, ta sẽ thực hiện điều này ở phần tiếp theo. Ngay bây giờ, chúng ta sẽ kết thúc phần này bằng cách xem một số tài liệu Java trực tuyến.
  6. MinhThy R.L.G

    API Java trực tuyến

    Giao diện lập trình ứng dụng (API) Java rất nhiều, bởi vậy học cách tìm kiếm như thế nào là điều quan trọng. Nền tảng java đủ lớn để cung cấp cho bạn hầu như bất cứ công cụ nào mà bạn cần khi lập trình. Học cách khai thác các khả năng cũng cần nhiều nỗ lực như khi học các cơ chế của ngôn ngữ.

    Nếu bạn vào trang tài liệu Java của Sun (xem phần Các tài nguyên để tìm các đường liên kết), bạn sẽ thấy một đường liên kết tới các tài liệu API cho từng phiên bản SDK. Đi theo liên kết dành cho phiên bản 1.4.2 để xem tài liệu đó như thế nào.

    Bạn sẽ thấy có 3 khung trên trình duyệt:

    * Danh sách các gói có sẵn ở khung trên cùng bên trái
    * Danh sách tất cả các lớp ở khung dưới bên trái
    * Chi tiết của cái mà bạn đã chọn ở phía bên phải

    Tất cả các lớp trong SDK đều có ở đây. Chọn lớp HashMap. Ở bên phải bạn sẽ thấy mô tả chi tiết của lớp này. Phía trên đỉnh là tên và gói chứa lớp này, hệ phân bậc các lớp, các giao diện mà lớp thực hiện (phần này nằm ngoài phạm vi của tài liệu này), và mọi lớp con trực tiếp mà lớp này hiện có. Tiếp sau, bạn sẽ thấy mô tả chi tiết về lớp. Đôi khi trong mô tả còn có cả ví dụ cách dùng, các liên kết có liên quan, gợi ý về kiểu cách, … Sau phần mô tả, bạn sẽ thấy danh sách các hàm tạo (constructors), tiếp đó là danh sách tất cả các phương thức của lớp, tiếp nữa là toàn bộ các phương thức thừa kế, sau đó là mô tả chi tiết của tất cả các phương thức. Thông tin rất đầy đủ và có một bảng chỉ mục chi tiết ở trên và dưới khung bên tay phải.

    Nhiều thuật ngữ trong đoạn trên đây (như gói – package) là mới với bạn vào lúc này. Đừng lo lắng. Chúng ta sẽ trình bày chúng một cách chi tiết. Bây giờ, điều quan trọng là bạn đã biết rằng tài liệu về ngôn ngữ Java luôn sẵn sàng trực tuyến cho bạn dùng.
  7. MinhThy R.L.G

    Tài nguyên

    Học tập

    * Trang chủ chính thức về công nghệ Java có đường liên kết đến mọi thứ liên quan đến nền tảng Java. Bạn có thể tìm thấy mọi tài nguyên ngôn ngữ Java “chính thống” bạn cần ngay ở đây, bao gồm cả các đặc tả ngôn ngữ và tài liệu API.

    * Học thêm về các công cụ dòng lệnh đi kèm với Java. .

    * Xem trang tài liệu Java để tìm các đường liên kết tới tài liệu API cho mỗi phiên bản SDK.

    * Bài Taming Tiger của John Zukowski trên developerWorks đưa ra một cách nhìn về phiên bản gần nhất của nền tảng J2SE.

    * Trang chủ javadoc chứa tất cả các thành phần trong ngoài của javadoc, bao gồm cả cách dùng các công cụ dòng lệnh và cách viết Doclet của riêng bạn nhằm cho phép bạn tạo ra khuôn dạng tùy chỉnh cho tài liệu của mình.

    * Tài liệu hướng dẫn về Sun Java là một nguồn tài nguyên tuyệt vời. Nó là lời giới thiệu nhẹ nhàng về ngôn ngữ này, chứa đựng nhiều tư liệu hơn hẳn tài liệu hướng dẫn này, bao gồm cả các liên kết đến các tài liệu hướng dẫn khác để tiếp cận tới các chi tiết hơn nữa về nhiều khía cạnh đa dạng của ngôn ngữ Java.

    * Tái cấu trúc, cuốn sách của Martin Fowler (Addison-Wesley, 1999) là nguồn tài nguyên tuyệt diệu để phát triển những mã lệnh hiện có.

    * Trang Bạn mới đến với công nghệ Java là cả một ngân hàng các tài nguyên developerWorks dành cho những người mới khởi đầu học Java, bao gồm cả các liên kết đến các nguồn tài liệu hướng dẫn và chứng chỉ.

    * Bạn sẽ tìm thấy các bài báo về đủ mọi khía cạnh của lập trình Java trên developerWorks tại vùng công nghệ Java.

    * Xem các trang hướng dẫn tại vùng công nghệ Java để tìm một danh sách đầy đủ các tài liệu hướng dẫn tập trung vào Java miễn phí trên developerWorks .


    Lấy sản phẩm và công nghệ


    * Bạn có thể tải Eclipse từ trang web của Eclipse..
  8. MinhThy R.L.G

    Các khái niệm 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.
  9. MinhThy R.L.G

    Lập trình hướng đối tượng với công nghệ Java


    Giới thiệu


    Công nghệ Java bao trùm nhiều thứ, nhưng bản thân ngôn ngữ Java lại không lớn lắm. Tuy nhiên, trình bày nó bằng ngôn ngữ thông thuờng, lại không phải là nhiệm vụ đơn giản. Phần này sẽ không bàn kỹ về ngôn ngữ này. Thay vào đó, sẽ nêu những gì bạn cần biết để khởi đầu và những gì bạn hầu như chắc chắn sẽ gặp với tư cách là lập trình viên mới vào nghề. Các tài liệu hướng dẫn khác sẽ trình bày các khía cạnh khác nhau của ngôn ngữ này, các thư viện hữu ích bổ trợ do Sun cung cấp, các tài nguyên khác và thậm chí cả các IDE.


    Chúng tôi sẽ trình bày đầy đủ ở đây cả lời dẫn giải và các ví dụ mã lệnh để bạn có thể bắt đầu viết các chương trình Java và học cách lập trình hướng đối tượng đúng đắn trong môi trường Java. Từ đó, vấn đề chỉ còn là việc thực hành và học tập.
    Hầu hết các tài liệu hướng dẫn nhập môn đọc lên giống như những cuốn sách tham khảo đặc tả ngôn ngữ. Đầu tiên bạn thấy tất cả các quy tắc cú pháp, sau đó bạn xem các ví dụ áp dụng, tiếp đó là nói về những chủ đề nâng cao hơn, như các đối tượng chẳng hạn. Ở đây chúng tôi sẽ không đi theo con đường đó. Đó là vì nguyên nhân chính dẫn đến các mã lệnh hướng đối tượng tồi tệ viết bằng ngôn ngữ Java là những lập trình viên mới vào nghề không đặt mình vào môi trường hướng đối tượng ngay từ đầu. Các đối tượng có khuynh hướng bị đối xử như một chủ đề phụ thêm (add-on) hay lệ thuộc. Thay vào đó, chúng tôi sẽ đan xen việc học cú pháp Java thông qua quá trình học Java hướng đối tượng. Bằng cách này, bạn sẽ có được một bức tranh mạch lạc về việc sử dụng ngôn ngữ ra sao trong bối cảnh hướng đối tượng.


    Cấu trúc của một đối tượng Java


    Hãy nhớ rằng, đối tượng là một thứ được bao gói kín, tự biết mọi điều về mình và có thể làm một số việc khi được yêu cầu thích hợp. Mọi ngôn ngữ đều có quy tắc định nghĩa một đối tượng như thế nào. Trong ngôn ngữ Java, đối tượng nói chung nom giống như liệt kê dưới đây, mặc dù chúng có thể thiếu hụt một số thành phần:
    package packageName;


    import packageNameToImport;


    accessSpecifier class ClassName {
    accessSpecifier
    dataType
    variableName [= initialValue ];
    ...

    accessSpecifier ClassName( arguments ) {
    constructor statement(s)
    }

    accessSpecifier
    returnValueDataType
    methodName ( arguments ) {
    statement(s)
    }
    }

    Ở đây có một số khái niệm mới mà chúng ta sẽ thảo luận trong vài phần tiếp sau.


    Các gói


    Khai báo gói phải xuất hiện đầu tiên khi bạn định nghĩa một lớp:
    package packageName;


    Mọi đối tượng Java đều nằm trong một package. Nếu bạn không nói rõ ràng nó thuộc gói nào, Java sẽ đặt nó vào trong gói mặc định. Một package chỉ đơn giản là một tập các đối tượng, tất cả (thường là thế) liên quan với nhau theo một cách nào đó. Các package quy chiếu theo đường dẫn đến tệp tin trong hệ thống tệp của bạn. Tên của các gói dùng ký pháp dấu chấm (.) để dịch đường dẫn tệp tin này thành một thứ mà nền tảng Java hiểu được. Mỗi mẩu trong tên package gọi là một nút (node).



    Ví dụ, trong gói có tên là java.util.ArrayList, java là một nút, util là một nút và ArrayList là một nút. Nút cuối cùng trỏ đến tệp ArrayList.java.


    Các câu lệnh nhập khẩu


    Tiếp theo là các câu lệnh nhập khẩu, khi bạn định nghĩa một lớp:
    import packageNameToImport;

    ...

    S
    Khi đối tượng của bạn sử dụng các đối tượng trong các gói khác, trình biên dịch của Java cần biết tìm chúng ở đâu. Một lệnh nhập khẩu (import) sẽ cho trình biên dịch biết nơi tìm những lớp bạn cần dùng. Ví dụ, nếu bạn muốn dùng lớp ArrayList từ gói java.util, bạn cần nhập khẩu theo cách sau:
    import java.util.ArrayList;

    Mỗi lệnh import kết thúc bằng một dấu chấm phẩy (;), giống như hầu hết các câu lệnh trong ngôn ngữ Java. Bạn có thể viết bao nhiêu câu lệnh nhập khẩu cũng được khi bạn cần cho Java biết tìm tất cả các lớp mà bạn dùng ở đâu. Ví dụ, nếu tôi muốn dùng lớp ArrayList từ gói java.util, lớp BigInteger từ gói java.math, tôi sẽ nhập khẩu chúng như sau:
    import java.util.ArrayList;
    import java.math.BigInteger;

    Nếu bạn nhập khẩu nhiều hơn một lớp từ cùng một gói, bạn có thể dùng cách viết tắt để cho biết bạn muốn nạp tất cả các lớp trong gói này. Ví dụ, nếu tôi muốn dùng cả ArrayList và HashMap, cả hai đều từ gói java.util, tôi sẽ nhập khẩu chúng như sau:
    import java.util.*;

    Bạn muốn nhập khẩu gói nào thì phải có lệnh nhập khẩu riêng cho gói đó.


    Khai báo một lớp


    Tiếp theo là khai báo lớp, khi bạn định nghĩa một lớp:
    accessSpecifier class ClassName {
    accessSpecifier
    dataType
    variableName [= initialValue ];
    ...

    accessSpecifier ClassName( arguments ) {
    constructor statement(s)
    }

    accessSpecifier
    returnValueDataType
    methodName ( arguments ) {
    statement(s)
    }
    }

    Bạn định nghĩa một đối tượng Java như một lớp. Hãy nghĩ rằng lớp là khuôn mẫu của đối tượng, một thứ gì đó giống như máy cắt bánh quy vậy. Lớp định nghĩa kiểu của đối tượng bạn có thể tạo ra từ lớp. Bạn có thể dập khuôn ra bao nhiêu đối tượng thuộc cùng kiểu đó như bạn muốn. Khi bạn làm thế, bạn đã tạo ra một cá thể của lớp – hoặc nói theo cách khác là bạn đã cụ thể hóa một đối tượng. (Chú ý: từ đối tượng được dùng hoán đổi lẫn lộn để chỉ một lớp lẫn một cá thể của lớp.)


    Định tố truy cập (access specifier) của một lớp có thể có nhiều giá trị, nhưng hầu hết đều là public (công cộng), và đó cũng là tất cả những gì chúng ta sẽ nói tới trong tài liệu hướng dẫn này. Bạn có thể đặt một cái tên bất kỳ nào bạn thích cho một lớp, nhưng tên của lớp theo quy ước bắt đầu bằng bằng một chữ cái viết hoa, và mỗi từ tiếp theo trong tên cũng bắt đầu bằng một chữ cái viết hoa.



    Lớp có hai kiểu thành phần: các biến (hay thành phần dữ liệu) và các phương thức. Tất cả các thành phần của lớp đều được định nghĩa trong thân lớp, nằm giữa cặp ngoặc nhọn của lớp.



    Các biến


    Giá trị của các biến trong một lớp là cái để phân biệt từng cá thể của lớp, đó là lý do vì sao chúng thường được gọi là các biến cá thể. Một biến có một định tố truy cập chỉ rõ những đối tượng nào được phép truy cập nó, một kiểu dữ liệu, một tên và (tùy chọn) một giá trị khởi tạo. Đây là danh sách các định tố truy cập và ý nghĩa của chúng:

    • public (công cộng): Bất kỳ đối tượng nào trong bất kỳ gói nào đều có thể thấy biến này.

    • protected (có bảo vệ): Bất kỳ một cá thể nào của lớp, lớp con trong cùng một gói và bất kỳ lớp nào không phải là lớp con nhưng nằm trong cùng một gói có thể thấy biến này. Lớp con trong các gói khác không thể thấy nó.

    • private (riêng tư): Không một đối tượng nào ngoài cá thể cụ thể của lớp có thể thấy được biến, thậm chí cả lớp con.

    • Không có định tố, (hoặc package protected (có bảo vệ theo gói)): Chỉ có các lớp trong cùng một gói với lớp chứa biến là có thể thấy biến mà thôi.
    Nếu bạn cố truy cập một biến không thể truy cập được, trình biên dịch sẽ thông báo biến đó là không nhìn thấy đối với bạn. Bạn sẽ dùng định tố truy cập gì trong những hoàn cảnh nào là nhờ vào óc suy xét, và chúng ta sẽ quay trở lại vấn đề này sau.


    Các phương thức


    Các phương thức của một lớp định nghĩa lớp có thể làm những gì. Có hai loại phương thức trong ngôn ngữ Java:

    • Hàm tạo
    • Các phương thức khác
    Cả hai đều có định tố truy cập (để chỉ ra những đối tượng nào có thể sử dụng chúng) và phần thân (giữa cặp ngoặc nhọn), có chứa một hay nhiều câu lệnh. Ngoài điều này ra, khuôn dạng và chức năng của chúng rất khác nhau. Chúng ta sẽ đề cập đến từng loại phương thức này ở hai phần tiếp sau.



    Hàm tạo


    Các hàm tạo cho phép bạn chỉ rõ cách cá thể hóa một lớp. Bạn khai báo một hàm tạo như sau:
    accessSpecifier ClassName( arguments ) {
    constructor statement(s)
    }

    Bạn nhận được sẵn một hàm tạo mặc định (không có tham số truyền vào) cho mọi lớp mà bạn tạo ra mà không phải làm gì. Thậm chí bạn không phải định nghĩa nó. Các hàm tạo trông khác với các phương thức khác ở chỗ chúng không có kiểu dữ liệu của giá trị trả về. Đó là vì kiểu dữ liệu giá trị trả lại của nó chính là lớp đó. Bạn viết mã lệnh gọi một hàm tạo như sau:
    ClassName variableHoldingAnInstanceOfClassName = new ClassName( arguments );

    Khi bạn gọi một hàm tạo, bạn dùng từ khóa new. Các hàm tạo có thể nhận tham số truyền vào hoặc không (hàm tạo mặc định không có tham số vào). Nghiêm túc mà nói, các hàm tạo không phải là phương thức hay thành viên của lớp. Chúng là một sinh thể đặc biệt trong ngôn ngữ Java. Tuy vậy, trong thực tế, vẻ bề ngoài và hoạt động của chúng nhiều lúc cũng giống các phương thức khác, và nhiều người gộp cả hai vào với nhau. Hãy ghi nhớ rằng chúng là đặc biệt.

  10. MinhThy R.L.G

    Các phương thức không là hàm tạo


    Các phương thức không là hàm tạo trong ngôn ngữ Java là thứ mà bạn thường sử dụng nhất. Bạn khai báo chúng như sau:
    accessSpecifier
    returnValueDataType
    methodName ( arguments ) {
    statement(s)
    }

    Tất cả các phương thức đều có kiểu trả về, nhưng không phải mọi phương thức đều trả lại thứ gì đó. Nếu phương thức không trả lại gì, bạn dùng từ khóa void để chỉ kiểu trả về. Bạn có thể đặt bất cứ tên gì mà bạn thích cho phương thức miễn là cái tên đó hợp lệ (không được khởi đầu bằng dấu chấm, ví dụ thế), nhưng theo quy ước thì tên phương thức là:

    • Là xâu ký tự các chữ cái
    • Bắt đầu bằng một ký tự viết thường
    • Bắt đầu các từ tiếp theo bằng ký tự viết hoa.
    Bạn gọi một phương thức như sau:
    returnType variableForReturnValue =
    instanceOfSomeClass.methodName(parameter1, parameter2, ...);

    Như vậy, bạn đang gọi phương thức methodName() của đối tượng instanceOfSomeClass, và truyền cho phương thức này một vài đối số. Sự khác biệt giữa tham số và đối số là không nhiều, nhưng chúng khác nhau. Phương thức nhận các tham số. Khi bạn truyền giá trị cụ thể vào phương thức lúc bạn gọi thì những giá trị này được gọi là đối số của lời gọi.

    Đối tượng Java đầu tiên của bạn

    Tạo một gói


    Nếu bạn còn chưa ở đó, hãy di chuyển đến phối cảnh Duyệt Java (Java Browsing) trong Eclipse. Chúng ta sẽ thiết đặt để tạo lớp Java đầu tiên của bạn. Bước thứ nhất là tạo một nơi cho lớp này tồn tại.

    Thay vì dùng gói mặc định, tốt hơn là ta hãy tạo một gói riêng cho dự án Intro của mình. Nhấn chuột chọn File>New>Package. Thao tác này sẽ mở Trình hướng dẫn tương tác Package (xem hình 3)

    Hình 3. Trình thủ thuật tạo gói

    [IMG]


    Gõ nhập intro.core là tên đặt cho gói và nhấn Finish. Bạn có thể thấy gói sau đây trong khung nhìn Packages trong vùng làm việc:

    intro.core

    Lưu ý rằng biểu tượng ở bên trái gói trông mờ mờ -- nhìn giống như một dạng mờ xám đi của biểu tượng gói. Đó là quy ước chung của giao diện người dùng trong Eclipse đối với những hạng mục trống rỗng. Gói của bạn chưa có bất cứ lớp Java nào bên trong nên biểu tượng của nó bị mờ đi.


    Khai báo một lớp

    Bạn có thể tạo một lớp Java trong Eclipse bằng cách chọn File>New,, nhưng chúng ta sẽ dùng công cụ thay thế. Nhìn lên phía trên khung nhìn Packages để thấy thanh công cụ tạo các dự án, gói và lớp. Nhấn chuột chọn công cụ New Java Class (chữ “C” màu xanh lục) để mở trình hướng dẫn tương tác New Java Class. Đặt tên lớp là Adult và chấp nhận các mặc định bằng cách nhấp Finish. Bạn sẽ thấy có một vài thay đổi:

    • Lớp Adult xuất hiện trên khung nhìn Classes, phía bên phải của khung nhìn Packages (xem hình 4).

    • Hình 4. Vùng làm việc

    • [IMG]

    • biểu tượng gói intro.core không còn bị mờ nữa.
    • Trình soạn thảo của Adult.java hiển thị bên dưới.
    Tại thời điểm này, lớp trông như sau:
    package intro.core;

    public class Adult {

    }

    Eclipse sinh ra một cái vỏ hay một khung mẫu cho lớp của bạn, và bao gồm luôn câu lệnh package nằm ở ngay đầu. Thân của lớp hiện giờ là rỗng. Đơn giản là chúng ta phải thêm da thịt vào. Bạn có thể cấu hình khung mẫu cho các lớp mới, phương thức mới, vân vân trong trình hướng dẫn tương tác Preferences mà bạn đã từng dùng trước đây (
    Window>Preferences ). Bạn có thể cấu hình khuôn mẫu cho mã lệnh trong đường dẫn đến các lựa chọn ưu tiên Java>Code Style>Code Templates. Thực tế, để đơn giản mọi thứ trong việc hiển thị mã lệnh, từ đây trở đi tôi đã loại bỏ tất cả các chú thích khỏi các khuôn mẫu này – nghĩa là bất kỳ dòng nào có dấu // ở trước hoặc bất kỳ dòng nào nằm trong cặp /* … */ hoặc cặp /** … **/. Từ bây giờ trở đi, bạn sẽ không nhìn thấy bất kỳ dòng chú thích nào trong mã lệnh nữa, trừ khi chúng ta đặc biệt thảo luận về cách dùng chúng ở phần sau.
    Tuy nhiên, trước khi chúng ta tiếp tục, ta hãy minh họa cách thức mà IDE Eclipse làm cho công việc của bạn dễ dàng hơn. Trong trình soạn thảo, hãy sửa đổi từ class thành clas và chờ vài giây. Bạn nhận thấy là Eclipse sẽ gạch chân chữ này bằng một đường lượn sóng màu đỏ. Nếu bạn di chuột qua một mục được gạch chân, Eclipse sẽ bật một cửa sổ thông tin để báo cho bạn biết bạn đang mắc lỗi cú pháp. Eclipse giúp bạn bằng cách liên tục biên dịch mã lệnh của bạn và kín đáo cảnh báo bạn nếu có vấn đề xảy ra. Nếu bạn dùng công cụ dòng lệnh javac, bạn sẽ phải biên dịch mã lệnh và chờ xem lỗi. Điều đó có thể làm chậm việc phát triển chương trình của bạn. Eclipse loại bỏ rắc rối đó.

  11. MinhThy R.L.G

    Các chú thích

    Giống như hầu hết các ngôn ngữ khác, ngôn ngữ Java hỗ trợ các chú thích, mà đơn giản là các câu lệnh mà trình biên dịch sẽ bỏ qua khi nó kiểm tra cú pháp xem có đúng không. Java có nhiều kiểu chú thích:

    // Chú thích một dòng. Trình biên dịch bỏ qua đoạn văn bản đi sau cặp dấu gạch xiên.

    /* Chú thích nhiều dòng. Trình biên dịch bỏ qua đoạn văn bản nằm giữa hai dấu sao. */
    /** Chú thích javadoc. Trình biên dịch bỏ qua đoạn văn bản nằm giữa hai dấu sao,
    và công cụ javadoc sẽ sử dụng chúng.
    */

    Kiểu cuối cùng là đáng chú ý nhất. Nói rất ngắn gọn, công cụ javadoc đi kèm với bản phân phối SDK Java mà bạn đã cài đặt có thể giúp bạn sinh ra tài liệu HTML cho mã lệnh của bạn. Bạn có thể sinh ra tài liệu cho các lớp riêng của mình và chúng sẽ trông tương tự như những gì bạn thấy trong tài liệu API Java mà bạn đọc trong
    The Java API online. Một khi bạn đã chú thích hợp lý cho mã lệnh của mình, bạn có thể chạy lệnh javadoc từ dòng lệnh. Bạn có thể tìm thấy chỉ dẫn thực hiện việc này, và tất cả thông tin đã có sẵn về javadoc trong trang web về công nghệ Java.

    Các từ dành riêng

    Còn một mục nữa cần đề cập trước khi chúng ta bắt đầu viết mã lệnh để bộ biên dịch kiểm tra. Java có một số từ mà bạn không được dùng để đặt tên cho các biến. Sau đây là danh sách các từ này:

    abstract boolean break byte case catch char class const continue char class default do double else extends false final finally float for goto if implements import int instanceof interface long int native new null package private protected public package private static strictfp super switch synchronized short super this throw throws true try transient return void volatile while assert true false null

    Danh sách này không dài, nhưng Eclipse sẽ tô đậm các từ này khi bạn gõ, bởi vậy bạn không phải ghi nhớ chúng. Tất cả, trừ ba từ cuối, trong danh sách là
    từ khóa Java. Ba từ này là các từ dành riêng. Sự khác biệt không quan trọng đối với những mục tiêu của chúng ta; bạn không thể sử dụng cả hai loại.

    Giờ ta hãy xem một số mã lệnh thực sự.

    Thêm các biến

    Như tôi trước đây đã nói, Adult biết tên, tuổi, chủng tộc và giới tính của nó. Chúng ta có thể bổ sung thêm các mẩu dữ liệu ấy cho lớp Adult của chúng ta bằng cách khai báo chúng dưới dạng các biến. Sau đó thì mọi cá thể của lớp Adult sẽ có các biến này. Mỗi Adult sẽ có giá trị khác nhau cho các biến này. Đó là lý do tại sao các biến của mỗi đối tượng lại thường được gọi là biến cá thể - chúng là cái để phân biệt mỗi cá thể của lớp. Ta hãy thêm biến, dùng định tố truy nhập protected cho mỗi biến:
    package intro.core;

    public class Adult {

    protected int age;
    protected String name;
    protected String race;
    protected String gender;
    }

    Bây giờ thì mọi cá thể của Adult đều sẽ chứa những mẩu dữ liệu này. Lưu ý ở đây mỗi dòng mã lệnh kết thúc bằng dấu chấm phẩy (
    ;). Ngôn ngữ Java yêu cầu điều đó. Cũng lưu ý thêm là mỗi biến có một kiểu dữ liệu. Ta có một biến kiểu số nguyên và ba biến kiểu xâu. Kiểu dữ liệu của các biến có hai dạng:

    • Các kiểu dữ liệu nguyên thủy
    • Các đối tượng (hoặc do người dùng định nghĩa hoặc là có sẵn trong ngôn ngữ Java), còn gọi là biến tham chiếu.

    Kiểu dữ liệu nguyên thủy

    Có chín kiểu dữ liệu nguyên thủy như bạn thường thấy:

    Type
    Size Default value Example boolean N/A false true byte 8 bits 0 2 char 16 bits 'u/0000' 'a' short 16 bits 0 12 int 32 bits 0 123 long 64 bits 0 9999999 float 32 bits with a decimal point 0.0 123.45 double 64 bits with a decimal point 0.0 999999999.99999999 Chúng ta dùng kiểu int cho dữ liệu age vì chúng ta không cần giá trị thập phân và một số nguyên là đủ lớn để mô tả tuổi thực của con người. Ta dùng kiểu String cho ba biến khác vì chúng không phải là số. String là một lớp trong gói java.lang, bạn có thể truy nhập vào mã lệnh của lớp này một cách tự động bất cứ lúc nào bạn muốn. Bạn cũng có thể khai báo các biến là kiểu do người dùng định nghĩa, ví dụ như Adult.

    Chúng ta định nghĩa mỗi biến trên một dòng riêng biệt, nhưng thực tế không cần phải làm như vậy. Khi bạn có hai hoặc nhiều hơn các biến có cùng kiểu, bạn có thể định nghĩa chúng trên cùng một dòng, chỉ cần ngăn cách chúng bằng dấu phẩy, như thế này:

    accessSpecifier dataType variableName1
    ,
    variableName2
    ,
    variableName3
    ,...


    Nếu chúng ta muốn khởi tạo các biến này khi khai báo chúng, ta chỉ cần thêm giá trị khởi tạo sau tên từng biến:

    accessSpecifier dataType variableName1
    = initialValue,
    variableName2
    = initialValue, ...


    Bây giờ lớp của chúng ta đã tự hiểu chính nó, chúng ta có thể minh chứng điều này như sau đây.


    Phương thức main()

    Có một phương thức đặc biệt mà bạn có thể đưa vào trong bất kỳ lớp nào để JRE có thể thi hành mã lệnh. Tên phương thức này là main(). Mỗi lớp chỉ có một phương thức main(). Dĩ nhiên, không phải mọi lớp đều có phương thức này nhưng vì Adult là lớp duy nhất mà hiện thời ta đang có, chúng ta sẽ bổ sung phương thức main() vào để có thể tạo một cá thể Adult và kiểm tra các biến cá thể của nó:
    package intro.core;

    public class Adult {

    protected int age;
    protected String name;
    protected String race;
    protected String gender;

    public static void main(String[] args) {
    Adult myAdult = new Adult();

    System.out.println("Name: " + myAdult.name);
    System.out.println("Age: " + myAdult.age);
    System.out.println("Race: " + myAdult.race);
    System.out.println("Gender: " + myAdult.gender);
    }
    }

    Trong thân của phương thức main(), chúng ta tạo một cá thể Adult, sau đó in ra giá trị của các biến cá thể. Hãy nhìn vào dòng đầu tiên. Đây là chỗ mà những người thuần túy chủ nghĩa hướng đối tượng khó chịu với ngôn ngữ Java. Họ cho rằng new nên là một phương thức của Adult và bạn phải gọi nó theo kiểu: Adult.new(). Dĩ nhiên tôi hiểu quan điểm của họ, nhưng ngôn ngữ Java không làm theo cách ấy, và đó là lý do để những người thuần túy chủ nghĩa có thể kêu ca hoàn toàn đúng rằng Java không thuần là hướng đối tượng. Hãy xem lại dòng đầu tiên một lần nữa. Nhớ rằng tất cả lớp Java đều có hàm tạo mặc định, là thứ mà ta đang dùng ở đây.


    Sau khi chúng ta tạo một cá thể Adult, chúng ta lưu nó trong một biến cục bộ gọi là myAdult. Sau đó ta in ra các giá trị của các biến cá thể của nó. Trong hầu hết các ngôn ngữ, bạn có thể in mọi thứ ra màn hình. Ngôn ngữ Java cũng không ngoại lệ. Cách bạn làm việc này trong mã lệnh Java là gọi phương thức println() của luồng out của đối tượng System. Đừng lo lắng về chuyện bạn phải hiểu tất cả chi tiết của quá trình ấy vào lúc này. Chỉ biết rằng chúng ta đang sử dụng một lời gọi phương thức hữu ích để in ra một thứ gì đó. Với mỗi lời gọi, ta chuyển giao một xâu trực kiện (string literal) và nối thêm giá trị của biến cá thể của myAdult. Chúng ta sẽ quay lại xem chi tiết phương thức này về sau.

  12. MinhThy R.L.G

    Thi hành mã lệnh trong Eclipse

    Để thi hành mã lệnh này, bạn phải thực hiện một ít thao tác trong Eclipse. Nhấn chọn lớp Adult trong khung nhìn Types và nhấn chọn biểu tượng “người đang chạy” trên thanh công cụ. Bạn sẽ thấy hộp thoại Run, nơi cho phép bạn tạo ra cấu hình khởi chạy cho chương trình của mình. Chọn kiểu cấu hình muốn tạo ra là Java Application rồi chọn New. Eclipse sẽ chỉ rõ tên mặc định đặt cho cấu hình này là “Adult”, và thế là ổn. Nhấn Run để thấy kết quả. Eclipse sẽ hiển thị khung nhìn Console bên dưới bộ soạn thảo mã lệnh giống như ở hình 5.

    Hình 5. Kết quả chạy chương trình


    [IMG]


    Lưu ý rằng các biến đều mang giá trị mặc định của chúng. Theo mặc định, bất kỳ biến cá thể nào dù là do người dùng định nghĩa hay có sẵn trong ngôn ngữ đều mang giá trị null. Khởi tạo tường minh các biến, đặc biệt là các đối tượng luôn luôn là một ý tưởng hay, nhờ đó bạn có thể chắc chắn về giá trị của các biến mà chúng có bên trong. Ta hãy quay lại và khởi tạo cho các biến những giá trị như sau:

    Variable
    Value name "Bob" age 25 race "inuit" gender "male" Chạy lại mã lệnh bằng cách nhấn chọn một lần nữa vào biểu tượng người đang chạy. Bạn sẽ thấy giá trị mới hiện lên trên console.

    Bây giờ thì hãy làm sao để Adult của chúng ta có khả năng nói cho những đối tượng khác biết về dữ liệu của nó.

    Các phương thức truy cập


    Xem xét bên trong đối tượng Adult của chúng ta chỉ bằng cách tham chiếu trực tiếp đến các biến thì cũng thuận tiện nhưng thường thì đó không phải là một ý tưởng hay khi một đối tượng lại moi móc vào bên trong một đối tượng khác theo cách đó. Điều đó vi phạm nguyên lý bao gói mà chúng ta đã nói trước đó, và nó cũng cho phép một đối tượng chọc ngoáy vào trạng thái nội tại của đối tượng khác. Lựa chọn khôn ngoan hơn là cho một đối tượng có khả năng nói cho đối tượng khác biết giá trị các biến cá thể của nó khi được hỏi tới. Bạn dùng các phương thức truy cập để làm điều này.


    Các phương thức truy cập là các phương thức giống như những phương thức khác nhưng chúng thường tuân thủ theo một quy ước đặt tên riêng. Để cung cấp giá trị một biến cá thể cho đối tượng khác, hãy tạo ra một phương thức có tên là getVariableName(). Tương tự như thế, để cho phép các đối tượng khác thiết đặt các biến cá thể của đối tượng của bạn, hãy tạo ra phương thức setVariableName().


    Trong cộng đồng Java, các phương thức truy cập này thường được gọi là các getter và các setter vì tên chúng bắt đầu bằng get và set. Chúng là những phương thức đơn giản nhất mà bạn từng thấy, vì thế chúng là những ví dụ tốt để minh họa cho những khái niệm phương thức đơn giản. Bạn nên biết rằng phương thức truy cập là thuật ngữ khái quát để chỉ những phương thức nhận thông tin về một đối tượng nào đó. Không phải tất cả các phương thức truy cập đều tuân theo quy tắc đặt tên dành cho getter và setter như chúng ta sẽ thấy sau này.



    Đây là một số đặc tính chung của các getter và setter:

    • Định tố truy cập của các getter và setter điển hình là public.

    • Các getter điển hình là không nhận tham số nào.

    • Các setter điển hình là nhận chỉ một tham số, đó là giá trị mới cho biến cá thể mà chúng thiết đặt.

    • Kiểu trả về của getter điển hình là cùng kiểu với biến cá thể mà nó báo lại giá trị.

    • Kiểu trả lại của setter điển hình là void, nghĩa là chúng không trả lại gì hết (chúng chỉ đặt giá trị cho biến cá thể).



    Khai báo các phương thức truy cập


    Chúng ta có thể thêm các phương thức truy cập cho biến cá thể age của Adult như sau:
    public int getAge() {
    return age;
    }
    public void setAge(int anAge) {
    age = anAge;
    }

    Phương thức getAge() trả lại giá trị của biến age bằng cách dùng từ khóa return. Các phương thức không trả lại giá trị gì thì ngầm hiểu có câu lệnh return void; ở cuối cùng. Trong phương thức lấy giá trị này, chúng ta tham chiếu đến biến age bằng cách dùng tên của biến.


    Chúng ta cũng có thể viết return this.age;;. Biến this quy về đối tượng hiện tại. Nó được ngầm hiểu khi bạn tham chiếu trực tiếp đến một biến cá thể. Một số lập trình viên hướng đối tượng Smalltalk thích dùng this bất cứ khi nào họ nói đến một biến cá thể, cũng giống như họ luôn dùng từ khóa self khi viết mã lệnh bằng Smalltalk. Bản thân tôi cũng thích như thế nhưng Java không yêu cầu như vậy và làm thế sẽ chỉ thêm chật chỗ trên màn hình, vì vậy các ví dụ trong tài liệu này sẽ không dùng this trừ trường hợp mã lệnh sẽ không tường minh nếu thiếu nó.



    Gọi các phương thức


    Giờ ta đã có các phương thức truy cập, chúng ta sẽ thay việc truy cập trực tiếp đến biến age trong phương thức main() bằng lời gọi phương thức. Bây giờ main() sẽ như sau:
    public static void main(String[] args) {
    Adult myAdult = new Adult();
    System.out.println("Name: " + myAdult.name);
    System.out.println("Age: " + myAdult.getAge());
    System.out.println("Race: " + myAdult.race);
    System.out.println("Gender: " + myAdult.gender);
    }

    Nếu bạn chạy lại mã lệnh, sẽ cho ra kết quả như cũ. Lưu ý rằng gọi phương thức của một đối tượng rất dễ dàng. Hãy sử dụng khuôn dạng sau:
    instanceName.methodName()

    Nếu phương thức này không cần tham số (ví dụ như getter), bạn vẫn phải viết cặp ngoặc đơn sau tên phương thức khi gọi. Nếu phương thức cần tham số (như setter), thì đặt chúng trong cặp ngoặc đơn, phân cách bởi dấu phẩy nếu có hơn một tham số.


    Một lưu ý nữa về setter trước khi ta chuyển sang chủ đề khác: nó nhận một tham số kiểu int có tên là anAge. Sau đó nó gán giá trị của tham số này cho biến cá thể age. Chúng ta có thể đặt cho tham số này cái tên bất kỳ mà ta muốn. Tên không quan trọng nhưng khi bạn tham chiếu đến nó trong phương thức thì phải gọi chính xác cái tên mình đã đặt.


    Trước khi chuyển sang phần khác, hãy thử dùng qua setter. Thêm dòng sau vào main() ngay sau khi chúng ta khởi tạo một đối tượng Adult:
    myAdult.setAge(35);

    Bây giờ thì chạy lại mã lệnh. Kết quả cho thấy tuổi là 35. Những gì diễn ra phía sau khung cảnh này là:

    • Chúng tra truyền một giá trị số nguyên cho phương thức thông qua tham số.
    • JRE cấp bộ nhớ cho tham số này và đặt tên cho nó là anAge.