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

Bài này 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.

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 đóng, 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 trông giống như liệt kê dưới đây, mặc dù chúng có thể thiếu 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 package

Khai báo package 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 (default package). 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 (.) để biên 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 import

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

import  packageNameToImport;

...

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 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 import 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 import cũng được khi bạn cần cho Java biết nơi để tìm tất cả các lớp mà bạn dùng. 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ẽ import chúng như sau:

import java.util.ArrayList;

import java.math.BigInteger;

Nếu bạn import nhiều hơn một lớp từ cùng một package, 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 package này. Ví dụ, nếu tôi muốn dùng cả ArrayList và HashMap, cả hai đều từ package java.util, tôi sẽ import chúng như sau:

import java.util.*;

Bạn muốn import package nào thì phải có lệnh import cho riêng package đó.

Khai báo một lớp (class)

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 mà bạn có thể tạo ra từ đó. Bạn có thể rậ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 phải 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 (variables) (hay thành phần dữ liệu) và các phương thức (methods). 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: Bất kỳ đối tượng nào trong bất kỳ package nào đều có thể thấy biến này.
  • protected: Bất kỳ một cá thể nào của lớp, lớp con trong cùng một package 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 package thì có thể thấy biến này. Lớp con trong các package khác không thể thấy nó.
  • private: 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 package 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.

Các phương thức không phải 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.

Bài tiếp theo chúng tôi sẽ hướng dẫn các bạn về đối tượng Java đầu tiên của bạn

Theo dõi http://laptrinhtot.com/dao-tao/bi-kip-lap-trinh để tiếp tục theo dõi các loạt bài mới nhất về Java nhé!

Tags: