Lập trình hướng đố i tượng trong Java phần 1 potx

17 301 0
Lập trình hướng đố i tượng trong Java phần 1 potx

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Lập trình hướng đố i tượng Java ́ LẬP TRINH HƢƠNG ĐÔI TƢỢ NG TRONG JAVA ́ phần Java là một ngôn ngƣ̃ lập trinh hƣơng đố i tƣợ ng Nế u bạn chƣa bao giơ dùng ̀ ́ ̀ một ngôn ngƣ̃ lập trình hƣơng đố i tƣợ ng trƣơc , bạn cần phải hiểu các khái niệm ́ ́ sau : lập trình hƣơ ng đố i tƣợ ng (Object Oriented Programming) là gì ? đố i tƣợ ng ́ (Object), lơp (class) là gì , mố i quan hệ giƣ̃a đố i tƣợ ng và lơp ́ ́ , gởi thông điệp (Messages) đến các đối tƣợng là gì ? I KHÁI NIỆM LẬP TRINH HƢỚNG ĐỐI TƢỢNG Lâ ̣p trình hƣớng đối tƣợng (Object Oriented Programming) Mỗi một chƣơng trinh máy tinh đề u gồ m có phầ n : phầ n mã lệnh và phầ n dƣ̃ ̀ ́ liệu Một số chƣơng trinh đặt trọng tâm phầ n mã lệnh , số khác đặt trọng tâm phầ n ̉ ̉ ̀ dƣ̃ liệu Tƣ đó dẫn đế n mô hinh quyế t đinh nên cấ u trúc của chƣơng trinh : một trả lơi ̣ ̀ ̀ ̀ ̀ cho câu hỏi “Điề u gì xảy ra” , và một cho “Cái gì chịu tác động” Mô hình gọi là mô hình hƣớng xử lý , nó mô tả nhƣ là một chƣơ ng trình bao gồ m một chuỗi các bƣơc thƣ̣ c hiện (mã lệnh) Nhƣng chƣơng trình càng ngày càng lơn và phƣc tạp thì ́ ́ ́ khó khăn để sử dụng mô hình thứ nhất Vì vậy mô hình thứ đƣợ c đƣa , đó là mô hinh hƣơng đố i tƣợ ng Chƣơng ̀ ́ trình của bạn sẽ xây dựng dựa vào dữ liệu và phần giao diện đƣợc định nghĩa cho phầ n dƣ̃ liệu đó Mô hình này đƣợ c mô tả nhƣ là dƣ̃ liệu điề u khiể n truy xuấ t đố i vơi mã ́ lệnh Ngôn ngƣ̃ lập trình hƣơng đố i tƣợ ng có các khả sau : ́ - Mô phỏng thế giơi thƣ̣ c một cách tƣ̣ nhiên bơi các đố i tƣợ ng và mố i quan hệ giƣ̃a ̉ ́ chúng, thuận tiện cho việc thiế t kế hệ thố ng phƣc tạp ́ - Thƣa kế mã có sẵn một cách dễ dàng, giúp tiết kiệm công sức và nâng cao suấ t ̀ của ngƣời lập trình, dễ bảo tri, dễ nâng cấ p, mơ rộng ̉ ̀ Trƣu tƣợng hoá (Abstraction) ̀ Con ngƣơi đã đơn giản hoá các vấ n đề phƣc tạp thông qua sƣ̣ trƣu tƣợ ng hoá ̀ ́ ̀ Ví dụ, ngƣơi sƣ dụng máy tinh kh ông nhin máy tinh một cách phƣc tạp Nhơ sƣ̣ trƣu ̉ ̀ ́ ̀ ́ ́ ̀ ̀ Lập trình hướng đố i tượng Java tƣợ ng hoá mà ngƣơi ta có thể sƣ dụng máy tinh mà không quan tâm đế n cấ u trúc chi ̉ ̀ ́ tiế t bên máy tinh Họ chỉ sử dụng chúng nhƣ là một thực thể ́ Cách tốt nhất để nắm vƣ̃ng kỹ thuật trƣu tƣợ ng là dùng hệ thố ng phân cấ p Điề u ̀ này cho phép bạn phân lớp các thành phần có ý nghĩa của cả hệ thống phức tạp , chia nhỏ chúng thành những phần đơn giản có thể quản lý đƣợc Nhìn bên ngoài má y tính là một đối tƣợng , nế u nhìn sâu một cấ p , máy tính bao gồm một số bộ phận : hộp điề u khiể n, màn hình, bàn phím, chuột , các bộ phận này lại bao gồm các bộ phận nhỏ hơn, ví dụ nhƣ hộp điều khiển có bảng m ạch chính chứa CPU, các mạch giao tiếp gắn bảng mạch chinh , đia cƣng, ổ đĩa mềm… Nhờ sự trừu tƣợng hoá mà bạn không ́ ̃ ́ quan tâm đế n chi tiế t tƣng bảng mạch , mà chỉ quan tâm mối quan hệ , giao tiế p giƣ̃a ̀ các bộ phận Một mạch giao tiếp dù có chức ly kỳ thế nào nữa , bạn có thể sử dụng không mấy khó khăn nếu đƣợc ấn vừa vặn vào khe cắm bảng mạch chính Sƣ̣ phân cấ p trƣu tƣợ ng một hệ thố ng phƣc tạp có thể áp dụng cho các ch ƣơng ̀ ́ trình máy tính Phầ n dƣ̃ liệu tƣ một chƣơng trinh hƣơng xƣ lý kinh điể n có thể trƣu ̉ ̀ ̀ ́ ̀ tƣợ ng hoá thành các đố i tƣợ ng thành phầ n Dãy các xử lý trở thành các thông điệp giƣ̃a các đố i tƣợ ng Vì thế các đối tƣợng cần có hoạt động đặc trƣng riêng Bạn có thể coi các đố i tƣợ ng này nhƣ nhƣ̃ng thƣ̣ c thể độc lập tiế p nhận các yêu cầ u tƣ bên ngoài ̀ Đây là phầ n cố t lõi của lập trình hƣơng đố i tƣợ ng ́ ́ II CƠ CHẾ TRIỂN KHAI MÔ HINH HƢƠNG ĐÔI TƢỢNG ́ Tấ t cả các ngôn ngƣ̃ lập trình hƣơng đố i tƣợ ng đề u có các chế cho phép bạn ́ triể n khai các mô hình hƣơng đố i tƣợ ng Đó là tính đóng gói, kế thƣa, và tính đa hình ́ ̀ Tính đóng gói (Encapsulation) Đây là chế dùng một vỏ bọc kết hợp phần dữ liệu và các thao tác dữ liệu đó (phầ n mã lệnh ) thành một thể thống nhất , tạo nên sự an toàn , tránh việc sử dụng không đúng thiế t kế , bảo vệ cho mã lệnh và dữ liệu chống việc truy xuấ t tƣ nhƣ̃ng đoạn ̀ mã lệnh bên ngoài Trong Java tính đóng gói thể hiện qua khái niệm lơp (Class) Lơp là hạt nhân của ́ ́ Java, tạo nền tảng cho lập trình hƣớng đối tƣợng Java Nó định nghĩa dữ liệu và các hành vi của nó (dƣ̃ liệu và mã lệnh), gọi là các thành viên của lớp , dùng chung cho các đối tƣợng cùng loại Tƣ sƣ̣ phân tich hệ thố ng , ngƣơi ta trƣu tƣợ ng nên các lơp ̀ ́ ̀ ̀ ́ Sau đó các đố i tƣợ ng đƣợ c tạo theo khuôn mẫu của lơp Mỗi đố i tƣợ ng thuộc một ́ lơp có dƣ̃ liệu và hành vi đinh nghia cho lơp đó , giố ng nhƣ là sinh tƣ một khuôn đúc ̣ ́ ̃ ́ ̀ Lập trình hướng đố i tượng Java của lớp đó Vì vậy mà l ớp là khuôn mẫu của đối tƣợng , đố i tƣợ ng là thể hiện của một lơp Lơp là cấ u trú c logic, còn đối tƣợng là cấu trúc vật lý Dƣ̃ liệu đinh nghia lơp ̣ ́ ́ ̃ ́ gọi là biến, mã lệnh gọi là phƣơng thức Phƣơng thƣc đinh nghia cho việc sƣ dụng dƣ̃ ̣ ̉ ́ ̃ liệu nhƣ thế nào Điề u này có nghia là hoạt động của lơp đƣợ c đinh nghia thông qua ̣ ̃ ́ ̃ phƣơng thƣc ́ Các đặc trƣng của lớp gồm có hai phần chính : thuộc tính (Attribute) và hành vi (Behavior) Giả sử bạn phải tạo giao diện với ngƣời dùng và cần có những nút nhấn (Button) Thế thì trƣ ớc hết bạn xây dựng lớp Button với các thuộc tính nhƣ nhãn ghi nút, chiề u rộng, chiề u cao, màu của nút, đồ ng thơi quy đinh hành vi của nút nhấ n , ̣ ̀ nghĩa là nút nhấn cần phản ứng nhƣ thế nào đƣợc chọn , phát yêu cầ u gì , có đổi màu hay nhấp nháy chi không Vơi lơp Button nhƣ vậy , bạn có thể tạo nhanh chóng ́ ́ nhƣ̃ng nút nhấ n cụ thể phục vụ cho các mục đích khác Gói là kỹ thuật c ủa Java , dùng để phân hoạch không gian tên lơp , giao diện ́ thành những vùng dễ quản lý hơn, thể hiện tinh đóng gói của Java ́ Tính kế thừa (Inheritance) Tính kế thừa là khả xây dựng các lớp mới từ các lớp đã có Tính đóng gói cũng tác động đến tính kế thừa Khi lơp đóng gói một số dƣ̃ liệu và phƣơng thƣc , lơp ́ ́ ́ mơi sẽ kế thƣa mọi cấ u trúc dƣ̃ liệu và các phƣơng thƣc của lơp mà nó kế thƣa Ngoài ́ ̀ ́ ́ ̀ nó có thể bổ sung các dƣ̃ liệu và các phƣơng thƣc của riêng minh ́ ̀ Nó rất q uan trọng vì nó ƣng dụng cho khái niệm phân cấ p ́ (mô hình TopDown) Không sƣ dụng phân lơp , mỗi lơp phải đinh nghia tấ t cả các dƣ̃ liệu và ̣ ̉ ́ ́ ̃ phƣơng thƣc của mình một cách rõ ràng Nế u sƣ dụng sƣ̣ kế thƣa, mỗi lơp chỉ cần định ̉ ́ ̀ ́ nghĩa thêm những đặc trƣng của mình Ví dụ : Xe có thể xem nhƣ một lớp và các xe Pergout , BWM, Dream là các đố i tƣợ ng của lớp xe Các xe đều có thể lái đi, dƣng lại Tƣ lơp xe trên, ta có thể xây dƣ̣ ng các ̉ ̀ ̀ ́ lơp xe đạp, xe ôtô Xe ôtô có thêm máy và có thể tƣ̣ khơi động… ̉ ́ Tính đa hình (Polymorphism) Khi một lơp đƣợ c kế thƣa tƣ các lơp tổ tiên thì nó có thể thay đổ i cách thƣc làm ́ ̀ ̀ ́ ́ việc của lơp tổ tiên một số phƣơng t hƣc nào đó (nhƣng tên , kiể u trả về , danh ́ ́ sách tham đối của phƣơng thức thì vẫn giữ nguyên ) Điề u này gọi là viế t chồ ng Nhƣ vậy vơi một tên phƣơng thƣc , chƣơng trình có thể có các hành động khác tùy ́ ́ thuộc vào lơp của đố i tƣợ ng gọi phƣơng thƣc Đó là tính đa hình ́ ́ Lập trình hướng đố i tượng Java Ví dụ : vơi một phƣơng thƣc chạy , xe ôtô, xe máy có thể tăng ga , còn xe đạp thì phải ́ ́ đạp… Tính đa hình còn thể hiện ở việc một giao diện có thể sử dụng cho các hoạt động của một lớp tổng quát , hay còn gọi là “một giao diện , nhiề u phƣơng thƣc” Có ́ nghĩa là có thể thiết kế một giao diện tổng quát cho một nhóm các hành vi liên quan Điề u này giảm thiể u sƣ̣ phƣc tạp bằ ng cách cho phép một giao diện có thể sƣ dụng cho ̉ ́ các hoạt động của một lớp tổng quát Trình biên dịch sẽ xác định hoạt động cụ thể nào sẽ đƣợc thi hành tùy theo điều kiện Bạn chỉ cần nhớ các giao diện của lớp tổng quát và sử dụng nó Sƣ̣ kế t hợ p đúng đắ n giƣ̃a : đa hình , đóng gói và kế thƣa tạo nên một môi ̀ trƣơng lập trình có khả phát triể n tố t rấ t nhiề u so vơi môi trƣơng không hỗ trợ ̀ ́ ̀ hƣơng đố i tƣợ ng Một phân cấ p lơp thiế t kế tố t là điề u bản cho việc sƣ dụng lại ̉ ́ ́ nhƣ̃ng đoạn mã lệnh mà bạn đã tố n công sƣc nhiề u cho việc phát triể n và kiể m tra ́ Tính đóng gói cho phép bạn sử dụng các đối tƣợng và lệnh thi hành tới chúng mà không phá vỡ cấ u trú c các đoạn mã lệnh đã bảo vệ bơi giao diện của các lơp Sƣ̣ đa ̉ ́ hình cho phép bạn tạo những đoạn mã lệnh gọn gàng , dễ đọc, dễ hiể u và có tính ổ n đinh ̣ Java là ngôn ngƣ̃ lập trình hƣơng đố i tƣợ ng nên có đầ y đủ cá ́ c tính , thƣ viện lơp Java đƣợ c cung cấ p khá đầ y đủ cho ngƣơi lập trinh để bắ t đầ u một dƣ̣ án ́ ̀ ̀ mơi ́ Lập trình hướng đố i tượng Java Chƣơng : ĐỐI TƢỢNG VÀ LỚP, MẢNG I XÂY DƢ̣ NG LƠP ́ Khi đinh nghia một lơp , bạn chỉ thuộc tính mà nó chứa đƣợc ̣ ̃ ́ thể hiện bằ ng biế n (Member Variable) và hành vi đƣợc thể hiện bởi hàm (Method) Các biến định nghĩa bên một lớp gọi là các biến thành viên (Member Variables) Mã lệnh chứa các phƣơng thức (Method) Các phƣơng thức và biế n đinh nghia lơp gọi chung là thành phầ n của lơp Trong hầ u hế t các lơp , các biến ̣ ̃ ́ ́ ́ thể hiện đƣợ c truy cập bơi các phƣơng thƣc đinh nghia lơp đó Vì vậy, chính các ̣ ̉ ́ ̃ ́ phƣơng thƣc quyế t đinh dƣ̃ liệu của lơp có thể dùng nhƣ thế nào Lơp đinh nghia một ̣ ̣ ́ ́ ́ ̃ kiể u dƣ̃ liệu mơi, dùng để tạo các đối tƣợng thuộc kiểu đó ́ Dạng đầy đủ của một định nghĩa lớp nhƣ sau : Lớp đƣợc truy xuất chung cho các [public] Package khác , mặc đinh chỉ ̣ có các đoạn mã cùng một gói mơi có ́ quyề n truy xuấ t nó [abstract] Lơp trƣu tƣợ ng, không thể khơi tạo ̉ ́ ̀ [final] Lớp hằng không có lớp , không kế thƣa ̀ class ClassName Tên lơp ́ [extends SuperClass] Kế thƣa lơp cha SuperClass ̀ ́ [implements Interfaces] Giao diện đƣợ c cài đặt bơi Class ̉ { //Member Variables Declarations Khai báo các biế n // Methods Declarations Khai báo các phƣơng thƣc ́ } Ví dụ : Tạo một lớp Box đơn giản với ba biến : width, height, depth /* Đinh nghia lơp ̣ ̃ ́ */ class Box { double width; double height; Lập trình hướng đố i tượng Java double depth; } II TẠO ĐỚI TƢỢNG Khai báo đớ i tƣợng Để có đƣợ c các đố i tƣợ ng của một lơp phải qua hai giai đoạn : ́  ClassName ObjectName; Ví dụ : Box myBox Khai bá o biến myBox có kiể u lơp Box Khai báo này thƣ̣ c không cấ p phát ký ́ ức đủ chứa đối tƣợng thuộc lớp Box , mà chỉ tạo quy chiếu trỏ đến đối tƣợng Box Sau câu lệnh này, quy chiế u myBox xuấ t hiện ký ƣc chƣa giá tri ̣ null chỉ rằ ng nó ́ ́ chƣa trỏ đế n một đố i tƣợ ng thƣ̣ c tế nào Khác với câu lệnh khai báo biến kiểu sơ cấp là dành chỗ ký ức đủ chứa một trị thuộc kiểu đó : Ví dụ : int i; Sau câu lệnh này, biế n nguyên i hình thành  Sau đó, để thực sự tạo một đối tƣợng và gán địa chỉ của đối tƣợng cho biến này, dùng toán tử new ObjectName = new ClassName(); Ví dụ : myBox = new Box();  Có thể kết hợp cả hai bƣớc vào một câu lệnh : ClassName ObjectName = new ClassName(); Ví dụ : Box myBox = new Box(); Box myBox2 = myBox; myBox2 tham chiế u đế n cùng đố i tƣợ ng mà myBox tham chiế u myBox m ybox width height depth Box Object myBox2 m ybox Cách truy xuất thành phần của lớp Lập trình hướng đố i tượng Java  Biế n khai báo đinh nghia lơp gồ m có hai loại : ̣ ̃ ́ - Biế n đố i tƣợ ng (Instance Variable hay Object Variable) : chỉ thuộc tính đối tƣợng , truy xuấ t phải khơi tạo đố i tƣợ ng ̉ + Cách khai báo biến đối tƣợng : Type InstanceVar; + Cách truy cập biến đối tƣợng : ObjectName.InstanceVar - Biế n lơp (Class Variable) : về bản chấ t là biế n toàn cục , là biến tĩnh đƣợc tạo lập một ́ lầ n cùng vơi lơp, dùng chung cho mọi đối tƣợng thuộc lớp, truy xuất không cầ n khơi ̉ ́ ́ tạo đối tƣợng, để trao đổi thông tin của các đố i tƣợ ng cùng lơp ́ + Cách khai báo biến lớp : static Type ClassVar; + Cách truy cập biến lớp : ClassName.ClassVar  Hàm khai báo định nghĩa lớp gồm có hai loại : - Hàm đối tƣợng (Object Method) : cách truy xuấ t hàm đố i tƣợ ng nhƣ biế n đố i tƣợ ng ObjectName.ObjectMethod(Parameter-List) - Hàm lớp (Class Method) : thông thƣơng một thành phầ n của lơp chỉ truy xuấ t sƣ̣ ̀ ́ liên kế t vơi một đố i tƣợ ng thuộc lơp của nó Tuy nhiên, có thể t ạo một thành phần ́ ́ mà có thể dùng một độc lập một mình, không cầ n tham chiế u đế n một đố i tƣợ ng cụ thể , có thể đƣợc truy xuất trƣớc bất kỳ đối tƣợng nào của lớp đó đƣợc tạo ra, bằ ng cách đặt trƣơc khai báo của nó từ khoá static Cách truy xuất hàm lớp : ́ ClassName.ClassMethod(Parameter-List) Các hàm toán học của lớp Math Package Java.Lang là hàm lơp nên gọi không ́ cầ n phải khơi tạo đố i tƣợ ng ̉ Ví dụ : double a = Math.sqrt(453.28); Ví dụ 1: class BaiTho { static int i; // Biế n lơp ́ String s; // Biế n đố i tƣợ ng BaiTho(String ss) { // Hàm khởi tạo s = ss; i++; Lập trình hướng đố i tượng Java } void content( ) { System.out.println(s); } } class UngDung { public static void main(String args[]){ BaiTho p1 = new BaiTho(“Chi co thuyen moi hieu”); BaiTho p2 = new BaiTho(“Bien menh mong nhuong nao”); p1.content(); p2.content(); System.out.println(“So cau tho la : “+BaiTho.i); } } Khi tạo đối tƣợng p1, p2 bơi toán tƣ new, hàm dựng BaiTho() đƣợ c gọi, và i tăng ̉ ̉ lên Ví dụ 2: class BaiTho2 { static int i; String s; BaiTho2(String ss) { // Hàm khởi tạo s = ss; i++; } static int number() { // Hàm lớp return i; } String content() { // Hàm đối tƣợng return s; } } class UngDung2 { public static void main (String args[]) { System.out.println(“Bai tho co “+BaiTho2.number()+“ cau”); BaiTho2.p1 = new BaiTho2(“Chi co thuyen moi hieu”); Lập trình hướng đố i tượng Java BaiTho2.p2 = new BaiTho2(“Bien menh mong nhuong nao”); System.out.println(“Bai tho co “+BaiTho2.number()+“ cau”); System.out.println(“Cau tho\n“+p1.content().toUpperCase()+”\nco” + p1.content().length() +” ky tu”); System.out.println(“Tu \”tinh yeu\“ bat dau sau ky tu thu“+ p2.content().indexOf(“tinh yeu”)+” cau\n”+ p2.content().toUpperCase()); } } Gọi hàm lớp BaiTho 2.number() lúc chƣa gọi hàm dựng BaiTho để khởi tạo đối tƣợng sẽ cho trị p1.content() trả về một đối tƣợng String III GIƠI THIỆU VỀ PHƢƠNG THỨC ́ Khai báo phƣơng thƣc (hàm) ́ Dạng tổng quát của một phƣơng thức nhƣ sau : điề u khiể n truy [acess] xuấ t [static] hàm lớp [abstract] hàm trừu tƣợng [final] hàm hằng [Type] MethodName(Parameter-List) throws exceptions { // Body of method } - Type : Kiể u dƣ̃ liệu hàm trả về , có thể là kiểu bất kỳ, kể cả các kiể u lơp bạn tạo ́ Nế u hàm không trả về giá tri ̣ nào, kiể u trả về của nó phải là void - Các hàm có kiểu trả về không phải là void sẽ trả về một giá tri ̣ cho chƣơng trình gọi nó dùng dạng câu lệnh return nhƣ sau : return biể u thƣc; ́ Lập trình hướng đố i tượng Java Giá trị của biểu thức đƣợc tính và trả về cho hàm - Tấ t cả thông tin bạn muố n truyề n đƣợ c gơi thông qua tham số nằ m hai dấ u ̉ () sau tên hàm Nế u không có tham số vẫn phải có ( ) Parameter-List : Danh sách tham đố i phân cách bơi các dấ u phẩ y , mỗi tham đố i phải ̉ đƣợ c khai báo kiể u, có thể là kiểu bất kỳ, có dạng : Type Parameter1, Type Parameter2 Phạm vi truy xuất thành phần của lớp Các điều khiển truy xuất của Java là public, private và protected protected chỉ áp dụng có liên quan đến kế thừa sẽ xét đến sau Khi bổ sung tiề n tố cho một thành phầ n của lơp (biế n và hàm) là : ́ - Tƣ khoá public : chỉ rằng thành phần này có thể đƣợc truy xuất bởi bất kỳ dòng ̀ lệnh nào dù hay ngoài lơp mà nó khai báo ̉ ́ - private : chỉ có thể đƣợc truy xuất lớp của nó , mọi đoạn mã nằ m ngoài lơp , kể ́ cả những lớp đều không có quyền truy xuất - Khi không có điề u khiể n truy xuấ t nào đƣợ c dùng, mặc nhiên là public nhƣng chỉ gói của nó, không thể truy xuấ t tƣ bên ngoài gói của nó ̀ Phƣơng thƣc main() ́ Khi chạy ƣng dụng độc lập , bạn chỉ tên Class muốn chạy , Java tim gọi hàm ́ ̀ main() trƣơc tiên Class đó , phƣơng thƣc main sẽ điề u khiể n chạy các phƣơng ́ ́ thƣc khác ́ Dạng tổng quát của phƣơng thức main() public static void main(String args[]) { // Body of Method } - Một chƣơng trình chỉ cầ n một lơp có phƣơng thƣc main () gọi là lớp ứng dụng độc lập ́ ́ Primary Class - Tƣ khoá static cho phép hàm main () đƣợ c gọi không cầ n khơi tạo đố i tƣợ ng Vì ̉ ̀ main() đƣợ c trinh thông dich của Java gọi trƣơc bấ t kỳ lơp nào đƣợ c khơi tạo ̣ ̉ ̀ ́ ́ - Tƣ khoá void cho biế t hàm main() không trả về giá tri ̣ ̀ - Tƣ khoá public chỉ rằ ng hàm này đƣợ c gọi bơi dòng lệnh bên ngoài lơp chƣơ ng ̉ ̀ ́ trình khởi động - Tham đố i String args [ ] khai báo tham số tên args thuộc lơp String , chƣa chuỗi ký tƣ̣ ́ ́ 10 Lập trình hướng đố i tượng Java Tham đố i này giƣ̃ các tham đố i dòng lệnh dùng thi hành chƣơng trinh ̀ Ví dụ : class ViDu { public static void main (String args[]) { for (int i=0; i < args.length; i++) { System.out.println(“Tham doi thu “+i+”: “+args[i]); } } } Khi chạy chƣơng trình : C:\>java ViDu Thu tham doi dong lenh  Tham doi thu : Thu Tham doi thu : tham C:>java ViDu Thu “tham doi” “dong lenh”  Tham doi thu : Thu Tham doi thu : tham doi Tham doi thu : dong lenh Ví dụ : class ViDu2; public static void main(String args[]) { int sum = 0; float avg = 0; for (int i=0; ijava ViDu2  Tong = Trung binh = 11 Lập trình hướng đố i tượng Java Hàm khởi tạo (Constructor) Có những thao tác cầ n thƣ̣ c hiện mỗi đố i tƣợ ng lầ n đầ u tiên đƣợ c tạo nhƣ khơi tạo giá tri ̣ cho các biế n Các công việc này có thể làm tự động bằng cách dùng ̉ hàm khởi tạo Hàm khởi tạo có cùng tên với lớp mà nó thuộc về, chỉ đƣợc tƣ̣ động gọi bơi toán ̉ tƣ new đố i tƣợ ng thuộc lơp đƣợ c tạo Hàm khởi tạo không có giá trị trả về , đinh ̣ ̉ ́ nghĩa hàm có thể ghi void hay không ghi Ví dụ : - kích thƣớc hộp đƣợc khởi tạo tự động đối tƣợng đƣợ c tạo class Box { double width; double height; double depth; double volume() { return width * height * depth; } Box(double w, double h, double d) { width = w; height = h; depth = d; } } class BoxDemo { public static void main (String args[ ]) { Box myBox1 = new Box(10,20,15); Box myBox2 = new Box(3,6,9); double vol; vol = myBox1.volume(); System.out.println(“Thể tich là : “+vol); ́ vol = myBox2.volume(); System.out.println(“Thể tich là : “+vol); ́ } } - Khi bạn không đinh nghia tƣơng mi nh hàm khơi tạo cho một lơp , Java sẽ tạo hàm ̣ ̉ ̃ ̀ ́ 12 Lập trình hướng đố i tượng Java khơi tạo mặc nhiên cho lơp đó Vì vậy các chƣơng trình trƣớc đó vẫn làm việc bình ̉ ́ thƣơng Hàm khởi tạo mặc nhiên không có danh sách tham đối, tƣ̣ động khơi tạo tấ t cả ̉ ̀ các biến của đố i tƣợ ng về tri ̣ rỗng theo các quy ƣơc mặc đinh của Java , trị cho kiể u ̣ ́ số , ký tự „\0‟ cho kiể u ký tƣ̣ char, trị false cho kiểu boolean, trị null cho các đối tƣợng - Hàm khởi tạo cũng có thể đƣợc nạp chồng nhƣ hàm bình thƣờng ̣ (sẽ nói rõ ở phần sau) nghĩa là ta đƣợc phép định nghĩa nhiều hàm khởi tạo khác ở danh sách tham đố i hay kiể u tham đố i Hàm hủy Các đối tƣợng cấp phát động bằng toán tử new , không tồ n tại tham c hiế u nào đến đối tƣợng, đố i tƣợ ng đó xem nhƣ không còn cầ n đế n nƣ̃a và bộ nhơ cho nó có ́ thể đƣợ c tƣ̣ động giải phóng bơi bộ thu gom rác (garbage collector) Trình thu gom rác ̉ hoạt động một tuyến đoạn (Thread) độc lập vơi chƣơng trinh của bạn Bạn không ́ ̀ phải bận tâm gì đối với công việc này Sau này bạn sẽ hiể u rõ tuyế n đoạn là thế nào Tuy nhiên, Java cũng cho phép ta viế t hàm hủy, có thể cũng cần thiết cho những trƣơng hợ p nào đó Hàm hủy Java chỉ đƣợc gọi bởi trình thu gom rác ̀ , vậy bạn khó đoán trƣớc vào lúc nào hàm hủy sẽ đƣợc gọi Dạng hàm hủy nhƣ sau : protected void finalize() { // Body of Method } Tƣ khoá this ̀ Nế u biế n đƣợ c đinh nghia thân hàm, đó là biế n cục bộ chỉ tồ n tại hàm ̣ ̃ đƣợ c gọi Nế u biế n cục bộ nhƣ vậy đƣợ c đặt tên trùng vơi biế n đố i tƣợ ng hoặc biế n ́ lơp, nó sẽ che khuất biến đối tƣợng hay biến lớp thân hàm : ́ Ví dụ : class ViDu { int test = 10; // Biến đối tượng void printTest() { int test = 20; // Biế n cục bộ System.out.println(“test = “+test); // In biế n cục bộ 13 Lập trình hướng đố i tượng Java } public static void main(String args[]) { ViDu a = new ViDu(); a.printTest(); } } Tƣ khoá this có thể dùng bên bấ t cƣ phƣơng thƣc nào để tham chiế u đế n ̀ ́ ́ đố i tƣợ ng hiện hành, biế n đố i tƣợ ng trùng tên vơi biế n cục bộ ́ Ví dụ : Thay dòng lệnh : System.out.println(“test = “+this.test); // In biế n cục bộ , this chỉ đố i tượng a Nạp chồng hàm (Overloaded Methods) Trong cùng một lớp, Java cho phép bạn đinh nghia nhiề u hàm trùng tên vơi điề u ̣ ̃ ́ kiện các hàm nhƣ vậy phải có danh sách tham đố i khác nhau, nghĩa là khác về số tham đố i hoặc kiể u của các tham đố i Khả nhƣ vậy gọi là sự nạp chồng hàm Java chỉ phân biệt hàm này với hàm khác dựa vào số tham đối và kiểu của các tham đối , bấ t chấ p tên hàm và kiể u của kế t quả trả về Ví dụ : // MyRect.java import java.awt.Point; class MyRect { int x1 = 0; int y1 = 0; int x2 = 0; int y2 = 0; MyRect buildRect(int x1, int y1, int x2, int y2) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; return this; 14 Lập trình hướng đố i tượng Java } MyRect buildRect(Point topLeft, Point bottomRight) { x1 = topLeft.x; y1 = topLeft.y; x2 = bottomRight.x; y2 = bottomRight.y; return this; } MyRect buildRect(Point topLeft, int w, int h) { x1 = topLeft.x; y1 = topLeft.y; x2 = x1+w; y2 = y1 + h; return this; } void display() { System.out.print(“Doi tuong MyRect : ”); } } Thật ra, gói awt có sẵn lơp Rectangle chuyên dùng để biể u diễn hình chƣ̃ ́ nhật Lơp MyRect của ta chỉ dùng để minh hoạ cho khái niệm nạp chồ ng hàm ́ lơp MyRect có nhƣ̃ng hàm giúp bạn tạo đố i tƣợ ng MyRect vơi nhƣ̃ng ́ ́ Trong yế u tố cho trƣơc khác : ́ - Cho trƣơc toạ độ góc trái x1, y1 và toạ độ góc dƣới phải x2, y2 ́ - Cho trƣơc góc trái và góc dƣơi phải của hinh chƣ̃ nhật dƣơi dạng đố i tƣợ ng Point ́ ́ ̀ ́ - Cho trƣơc toạ độ góc trái ́ của hình chữ nhật dạng đối tƣợng Point cùng chiều rộng, chiề u cao Nhơ khả nạp chồ ng hàm , bạn chỉ cần nhớ một tên hàm cho các hàm khác ̀ cùng chƣc ́ Chƣơng trinh sƣ dụng lơp MyRect xây dƣ̣ ng : ̉ ̉ ̀ ́ import java.awt.Point; class UngDung { public static void main(String args[]) { 15 Lập trình hướng đố i tượng Java MyRect rect = new MyRect(); rect.buildRect(25,25,50,50); rect.display(); rect.buildRect(new Point(10,10), new Point(20,20)); rect.display(); rect.buildRect(new Point(10,10), 50, 50); rect.display(); } } Truyề n tham đố i Java dùng cả hai cách truyề n tham đố i : truyề n bằ ng giá tri ̣ và truyề n bằ ng tham chiế u, tùy vào cái gì đƣợc truyền - Khi ta truyề n một kiể u sơ cấ p cho phƣơng thƣc ́ , nó sẽ truyền bằng giá trị Vì vậy nhƣ̃ng gì xảy với tham đối phƣơng thức , khỏi phƣơng thƣc sẽ hế t tác ́ dụng - Khi ta truyề n một đố i tƣợ ng (kiể u phƣc hợ p ) cho phƣơng thƣc , nó sẽ truyền bằng ́ ́ tham chiế u Vì vậy, thay đổ i đố i tƣợ ng bên phƣơng thƣ c ảnh hƣơng đế n đố i ̉ ̉ ́ tƣợ ng dùng làm tham đố i Ví dụ : class ViDu { void tinhToan(int i, int j) { i *= 2; j /= 2; } } class UngDung { public static void main(String args) { ViDu o = new ViDu(); int a = 15, b = 20; System.out.println(“a và b trƣớc gọi : “+a+ “ ”+b); o.tinhToan(a, b); System.out.println(“a và b sau gọi : “+a+” “+b); } 16 Lập trình hướng đố i tượng Java } Kết quả của chƣơng trình : a và b trƣơc gọi : 15 20 ́ a và b sau gọi : 15 20 Ví dụ : class ViDu { int a, b; ViDu (int i, int j) { a = i; b = j; } void tinhToan(ViDu o) { o.a *= 2; 0.b /= 2; } } class UngDung { public static void main(String args[]) { ViDu o = new ViDu(15, 20); System.out.println(“o.a và o.b trƣơc gọi : “+o.a+” “+o.b); ́ o.tinhToan(o); System.out.println(“o.a và o.b sau gọi : “+o.a+” “+o.b); } } Kết quả chƣơng trình : o.a và o.b trƣơc gọi : 15 20 ́ o.a và o.b sau gọi : 30 10 17 ... MyRect .java import java. awt.Point; class MyRect { int x1 = 0; int y1 = 0; int x2 = 0; int y2 = 0; MyRect buildRect(int x1, int y1, int x2, int y2) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2;... static int i; // Biế n lơp ́ String s; // Biế n đố i tƣợ ng BaiTho(String ss) { // Hàm khơ? ?i tạo s = ss; i+ +; Lập trình hướng đố i tượng Java } void content( ) { System.out.println(s);... thành phần của lớp Lập trình hướng đố i tượng Java  Biế n khai báo đinh nghia lơp gồ m có hai loa? ?i : ̣ ̃ ́ - Biế n đố i tƣợ ng (Instance Variable hay Object Variable) : chỉ thuộc

Ngày đăng: 12/07/2014, 22:20

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan