1. Trang chủ
  2. » Trung học cơ sở - phổ thông

Giáo trình Java cơ bản: Phần 2 - Trường Đại Học Quốc Tế Hồng Bàng

20 8 0

Đ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

Nội dung

thao tác giải phóng, dọn dẹp vùng nhớ đã cấp phát cho các đối tượng dữ liệu trong phương thức finalize() sẽ giúp cho người lập trình chủ động kiểm soát tốt quá trình hủy [r]

(1)

System.out.print("\n"); }

}

C

Ch

ươ

ơn

ng

g

3

3

:

:

H

ƯỚ

ỚN

NG

G

Đ

ĐỐ

ỐI

I

T

ƯỢ

ỢN

NG

G

T

TR

RO

ON

NG

G

J

JA

AV

VA

A

3

3 11 MMở ởđầđầuu

(2)

rất hiệu để xây dựng nên chương trình ứng dụng máy tính Từ đời lập trình OOP chứng tỏ sức mạnh, vai trò đề án tin học Chhưươơnngg n

nààyyssẽẽggiiúúppbbạạnnđđọọccttììmmhhiiểểuuvvềềccáácckkiiểểuuddữữlliiệệuuddẫẫnnxxuuấấttđđóóllàà l

lớớpp((ccllaassss))vvààggiiaaoo ttiiếếpp((iinntteerrffaaccee)),,ccũũnngg nnhhưưccáácc vvấấnnđđềềccơơbbảảnn v

vềềllậậpp ttrrììnnhh hhưướớnnggđđốốii ttưượợnngg ttrroonnggjjaavvaatthhơơnnggqquuaa vviiệệccttạạoo llậậpp c

cááccllớớpp,,ccááccđđốốiittưượợnnggvvààccááccttíínnhhcchhấấttccủủaacchhúúnngg 3

3 22 LLớpớp((CCllaassss)) 3

3 22 11 KKhhááiinniiệmệm

Chúng ta xem lớp khn mẫu (template) đối tượng (Object) Trong bao gồm liệu đối tượng (fields hay properties) phương thức(methods) tác động lên thành phần liệu gọi phương thức lớp

Các đối tượng xây dựng lớp nên gọi thể lớp (class instance)

3

3 22 22 KKhhaaiibbááoo//địđịnnhhnngghhĩaĩallớớpp

class <ClassName> {

<kiểu liệu> <field_1>; <kiểu liệu> <field_2>; constructor

method_1 method_2 }

class: từ khóa java

ClassName: tên đặt cho lớp

field_1, field_2: thuộc tính, biến, hay thành phần liệu lớp

constructor: xây dựng, khởi tạo đối tượng lớp

(3)

3

3 22 33 TTạạoođốđốiittượượnnggccủaủallớpớp

ClassName objectName = new ClassName(); 3

3 22 44 TThhuuộcộcttíínnhhccủaủallớpớp

Vùng liệu (fields) hay thuộc tính (properties) lớp khai báo bên lớp sau:

class <ClassName> {

// khai báo thuộc tính lớp <tiền tố> <kiểu liệu> field1; // …

}

Để xác định quyền truy xuất đối tượng khác vùng liệu lớp người ta thường dùng tiền tố sau:

public: truy xuất từ tất đối tượng khác

private: lớp khơng thể truy xuất vùng private

lớp khác

protected: vùng protected lớp cho phép

thân lớp lớp dẫn xuất từ lớp truy cập đến

Ví dụ:

public class xemay

{ public String nhasx; public String model; private float chiphisx; protected int thoigiansx; // so luong so cua xe may: 3, so protected int so;

(4)

public static int sobanhxe = 2; }

Thuộc tính “nhasx”, “model”có thể truy cập đến từ tất đối tượng khác

Thuộc tính “chiphisx” truy cập từ đối tượng có kiểu “xemay”

Thuộc tính “thoigiansx”, so truy cập từ đối tượng có kiểu “xemay” đối tượng lớp dẫn xuất từ lớp “xemay”

Lưu ý: Thơng thường để an tồn cho vùng liệu đối

tượng người ta tránh dùng tiền tố public, mà thường chọn tiền tố private để ngăn cản quyền truy cập đến vùng liệu lớp từ phương thức bên lớp

3

3 22 55 HHààmm PPhhươươnnggtthhứcứcllớpớp((MMeetthhoodd))

Hàm hay phương thức (method) Java khối lệnh thực chức năng, hành vi xử lý lớp lên vùng liệu

Khai báo phương thức:

<Tiền tố> <kiểu trả về> <Tên phương thức> (<danh sách đối số>)

{

<khối lệnh>; }

Để xác định quyền truy xuất đối tượng khác phương thức lớp người ta thường dùng tiền tố sau:

public: phương thức truy cập từ bên

lớp khai báo

protected: truy cập từ lớp khai báo

những lớp dẫn xuất từ

private: truy cập bên thân lớp khai

(5)

static: phương thức lớp dùng chung cho tất thể

hiện lớp, có nghĩa phương thức thực kể khơng có đối tượng lớp chứa phương thức

final: phương thức có tiền tố khơng khai báo

chồng lớp dẫn xuất

abstract: phương thức khơng cần cài đặt (khơng có

phần source code), thực lớp dẫn xuất từ lớp

synchoronized: dùng để ngăn tác động đối

tượng khác lên đối tượng xét đồng hóa Dùng lập trình miltithreads

<kiểu trả về>: kiểu void, kiểu sở hay lớp <Tên phương thức>: đặt theo qui ước giống tên biến <danh sách thơng số>: rỗng

Lưu ý:

Thông thường lớp phương thức nên khai báo dùng từ khóa public, khác với vùng liệu thường dùng tiền tố private mục đích an tồn

Những biến nằm phương thức lớp biến cục (local) nên khởia tạo sau khai báo

Ví dụ:

public class xemay {

(6)

// biến tĩnh có giá trị tất // thể tạo từ lớp xemay public static int sobanhxe = 2; public float tinhgiaban()

{

return 1.5 * chiphisx; }

} 3

3 22 66 KKhhởiởittạoạommộộttđốđốiittượượnngg((CCoonnssttrruuccttoorr))

Contructor thật loại phương thức đặc biệt lớp Constructor dùng gọi tự động khởi tạo thể lớp, dùng để khởi gán giá trị măc định Các constructor khơng có giá trị trả về, có tham số khơng có tham số

Constructor phải có cùng tên với lớp gọi đến dùng

từ khóa new

Nếu lớp khơng có constructor java cung cấp cho lớp constructor mặc định (default constructor) Những thuộc tính, biến lớp khởi tạo giá trị mặc định (số: thường giá trị 0, kiểu luận lý giá trị false, kiểu đối tượng giá trị null, …)

Lưu ý: thơng thường để an tồn, dễ kiểm sốt làm chủ mã

nguồn chương trình nên khai báo constructor cho lớp

Ví dụ:

public class xemay {

// …

(7)

{}

public xemay(String s_nhasx, String s_model, f_chiphisx, int i_thoigiansx, int i_so);

{

nhasx = s_nhasx; model = s_model; chiphisx = f_chiphisx; thoigiansx = i_thoigiansx; so = i_so;

//

// this.nhasx = s_nhasx; // this.model = s_model; // this.chiphisx = f_chiphisx; // this.thoigiansx = i_thoigiansx; // this.so = i_so;

} }

3

3 22 77 BBiiếnếntthhiiss

Biến this biến ẩn tồn tất lớp

ngông ngữ java Một class Java tồn mmộộtt biến this, biến this sử dụng chạy tham khảo đến thân lớp chứa

Ví dụ:

<tiền tố> class A {

<tiền tố> int <field_1>; <tiền tố> String <field_2>; // Contructor lớp A

(8)

this.field_1 = par_1; this.field_2 = par_2; }

<tiền tố> <kiểu trả về> <method_1>() {

// … }

<tiền tố> <kiểu trả về> <method_2>() {

this.method_1() // …

} } 3

3 22 88 KKhhaaiibbááoocchhồnồnggpphhưươơnnggtthhứứcc((oovveerrllooaaddiinnggmmeetthhoodd)) Việc khai báo lớp nhiều phương thức có tên khác tham số (khác kiểu liệu, khác số lượng tham số) gọi khai báo chồng phương thức (overloading method)

Ví dụ:

public class xemay

{ // khai báo fields … public float tinhgiaban() { return * chiphisx; }

public float tinhgiaban(float huehong) { return (2 * chiphisx + huehong); }

} 3

3 33 ĐặĐặccđđiiểmểmhhướướnnggđốđốiittượượnnggttrroonnggjjaavvaa

(9)

điểm chung: tính đóng gói (encapsulation), tính đa hình (polymorphism), tính kế thừa (inheritance)

3

3 33 11 ĐóĐónnggggóóii((eennccaappssuullaattiioonn))

Cơ chế đóng gói lập trình hướng đối tượng giúp cho đối tượng dấu phần chi tiết cài đặt, phần liệu cục nó, cơng bố ngồi cần cơng bố để trao đổi với đối tượng khác Hay nói đối tượng thành tố hỗ trợ tính đóng gói

Đơn vị đóng gói ngôn ngữ java class Một class định nghĩa hình thức đối tượng Một class định rõ thành phần liệu đoạn mã cài đặt thao tác xử lý đối tượng liệu Java dùng class để xây dựng đối tượng Những đối tượng thể (instances) class

Một lớp bao gồm thành phần liệu thành phần xử lý Thành phần liệu lớp thường bao gồm biến thành viên biến thể lớp Thành phần xử lý thao tác thành phần liệu, thường java người gọi phương thức Phương thức thuật ngữ hướng đối tượng java, C/C++ người ta thường dùng thuật ngữ hàm

3

3 33 22 TTíínnhhđđaahhììnnhh((ppoollyymmoorrpphhiissmm))::

Tính đa hình cho phép cài đặt lớp dẫn xuất khác từ lớp nguồn Một đối tượng có nhiều kiểu khác gọi tính đa hình

Ví dụ:

class A_Object {

// …

void method_1() {

(10)

} }

class B_Object extends A_Object {

// …

void method_1() {

// … }

} class C

{ public static void main(String[] args) {

// Tạo mảng phần tử kiểu A

A_Object arr_Object = new A_Object[2]; B_Object var_1 = new B_Object();

// Phần tử đầu tiên mảng arr_Object[0] tham // chiếu đến đối tượng kiểu B_Object dẫn xuất // từ A_Object

arr_Object[0] = var_1; A_Object var_2;

for (int i=0; i<2; i++) {

var_2 = arr_Object[i]; var_2.method_1(); }

} }

(11)

- Với i = biến var_2 có kiểu B_Object, lệnh var_2.method_1() gọi thực phương thức method_1 lớp B_Object

- Với i = biến var_2 có kiểu A_Object, lệnh var_2.method_1() gọi thực phương thức method_1 lớp A_Object

Trong ví dụ đối tượng var_2 nhận kiểu A_Object hay B_Object Hay nói khác, biến đối tượng kiểu A_Object var_2 ví dụ tham chiếu đến đối tượng lớp lớp A_Object (ví dụ var_2 tham chiếu đến đối tượng var_1, var_1 đối tượng lớp B_Object dẫn xuất từ lớp A_Object) Ngược lại biến lớp tham chiếu đến đối tượng lớp cha

3

3 33 33 TTíínnhhkkế ếtthhừaừa((iinnhheerriittaannccee))

Một lớp (subclass) kế thừa tất vùng liệu phương thức lớp khác (siêu lớp - superclass) Như việc tạo lớp từ lớp biết cho thành phần (fields methods) lớp cũ thành thành phần (fields methods) lớp Khi ta gọi lớp lớp dẫn xuất (derived class) từ lớp cũ (superclass) Có thể lớp cũ lớp dẫn xuất từ lớp đấy, lớp vừa tạo lớp cũ lớp siêu lớp trực tiếp (immediate supperclass)

Dùng từ khóa extends để lớp dẫn xuất

class A extends B {

// … }

(12)

Tính kế thừa giúp cho lớp nhận thuộc tính/phương thức public protected lớp cha Đồng thời thay phương thức lớp cha cách khai báo chồng Chẳng hạn phương thức tinhgiaban() áp dụng lớp xega sẽ cho kết gấp 2.5 lần chi phí sản xuất thay gấp chi phí sản xuất giống lớp xemay

Ví dụ:

public class xega extends xemay {

public xega() {

}

public xega(String s_nhasx, String s_model, f_chiphisx, int i_thoigiansx);

{

this.nhasx = s_nhasx; this.model = s_model; this.chiphisx = f_chiphisx; this.thoigiansx = i_thoigiansx; this.so = 0;

}

public float tinhgiaban() {

return 2.5 * chiphisx; }

}

Java cung cấp tiền tố/từ khóa để hỗ trợ tính kế thừa lớp:

public: lớp truy cập từ gói, chương trình

khác

final: Lớp hằng, lớp khơng thể tạo dẫn xuất (khơng thể

(13)

aabbssttrraacctt:: Lớp trừu tượng (khơng có khai báo thành phần phương thức lớp trừu tượng) Lớp dẫn xuất khai báo, cài đặt cụ thể thuộc tính, phương thức lớp trừu tượng

3.3.3.2 Lớp nội

Lớp nội lớp khai báo bên lớp khác Lớp nội thể tính đóng gói cao truy xuất trực tiếp biến lớp cha

Ví dụ:

public class A {

// …

int <field_1> static class B {

// …

int <field_2> public B(int par_1) {

field_2 = par_1 + field_1; }

} }

Trong ví dụ chương trình dịch tạo hai lớp với hai files khác nhau: A.class B.class

3.3.3.3 Lớp vô sinh

(14)

Để khai báo lớp lớp “vô sinh”, dùng từ khóa final class

Tất phương thức lớp vô sinh vô sinh, thuộc tính lớp vơ sinh khơng vơ sinh

Ví dụ:

public final class A {

public final int x; private int y;

public final void method_1() {

// … }

public final void method_2() {

// … }

}

3.3.3.4 Lớp trừu tượng

Lớp trừu tượng lớp khơng có khai báo thuộc tính thành phần phương thức Các lớp dẫn xuất khai báo thuộc tính, cài đặt cụ thể phương thức lớp trừu tượng

Ví dụ:

abstract class A {

(15)

}

public class B extends A {

public void method_1() {

// cài đặt chi tiết cho phương thức method_1 // lớp B

// … } }

public class C extends A {

public void method_1() {

// cài đặt chi tiết cho phương thức method_1 // lớp C

// … } }

Lưu ý: Các phương thức khai báo dùng tiền tố

private static khơng khai báo trừu tượng

abstract Tiền tố private khơng thể truy xuất từ lớp dẫn

xuất, cịn tiền tố static dùng riêng cho lớp khai báo mà

thôi

3.3.3.5 Phương thức finalize()

Trong java kiểu liệu trỏ C, người lập trình khơng cần phải q bận tâm việc cấp phát giải phóng vùng nhớ, có trình dọn dẹp hệ thống đảm trách việc Trình dọn dẹp hệ thống dọn dẹp vùng nhớ cấp phát cho đối tượng trước hủy đối tượng

(16)

thao tác giải phóng, dọn dẹp vùng nhớ cấp phát cho đối tượng liệu phương thức finalize() sẽ giúp cho người lập trình chủ động kiểm sốt tốt q trình hủy đối tượng thay vị giao cho trình dọn dẹp hệ thống tự động Đồng thời việc cài đặt phương thức finalize() giúp cho nhớ được giải phóng tốt hơn, góp phần cải tiến tốc độ chương trình

Ví dụ:

class A {

// Khai báo thuộc tính public void method_1() {

// … }

protected void finalize() {

// Có thể dùng đểđóng tất kết nối // vào sở liệu trước hủy đối tượng // …

} } 3

3 44 GGóóii((ppaacckkaaggeess))

Việc đóng gói lớp lại tạo thành thư viện dùng chung gọi package

(17)

Để khai báo lớp thuộc gói ta phải dùng từ khóa package

Dịng khai báo gói phải dòng tập tin khai báo lớp

Các tập tin khai báo lớp gói phải lưu thư mục

Lưu ý: Việc khai báo import tất lớp gói làm tốn

bộ nhớ Thơng thường nên import lớp cần dùng chương trình

Ví dụ:

package phuongtiengiaothong; class xemay

{

// … }

class xega extends xemay {

// … }

Khi muốn sử dụng lớp xemay vào chương trình ta khai báo sau:

import phuongtiengiaothong.xemay; 3

3 55 GGiiaaooddiiệnện((iinntteerrffaaccee)) 3

3 55 11 KKhhááiinniiệmệmiinntteerrffaaccee::

(18)

thừa hưởng thêm vùng liệu phương thức giao tiếp

3

3 55 22 KKhhaaiibbááooiinntteerrffaaccee::

Interface khai báo lớp Nhưng thuộc tính interface (khai báo dùng từ khóa final) phương thức giao tiếp trừu tượng (mặc dù từ khóa abstract)

Trong lớp có cài đặt interface ta phải tiến hành cài đặt cụ thể phương thức

Ví dụ:

public interface sanpham

{ static final String nhasx = “Honda VN”; static final String dienthoai = “08-8123456”; public int gia(String s_model);

}

// khai báo lớp có cài đặt interface public class xemay implements sanpham

{ // cài đặt lại phương thức giao diện lớp public int gia(String s_model)

{

if (s_model.equals(“2005”)) return (2000);

else

return (1500); }

public String chobietnhasx() {

return (nhasx); }

(19)

Có vấn đề khác với lớp giao diện (interface) giao diện cha trực tiếp mà dẫn xuất lúc nhiều giao diện khác (hay có nhiều giao diện cha) Khi kế thừa tất giá trị phương thức giao diện cha Các giao diện cha liệt kê thành chuỗi cách dấu phẩy “,” Khai báo sau:

public interface InterfaceName extends interface1, interface2, interface3

{

// … }

3

3 55 33 VVííddụụ mmiinnhhhhọaọa

Ví dụ 1: Minh họa tính đa hình (polymorphism) phân cấp

kế thừa thơng qua việc mô tả xử lý số thao tác đối tượng hình học

// Định nghĩa lớp trừu tượng sở tên Shapetrong // tập tin Shape.java

public abstract class Shape extends Object {

// trả diện tích đối tượng hình học shape public double area()

{

return 0.0; }

// trả thể tích đối tượng hình học shape public double volume()

{

(20)

// Phương thức trừu tượng cần phải thực // lớp để trả tên đối tượng // hình học shape thích hợp

public abstract String getName(); } // end class Shape

// Định nghĩa lớp Point tập tin Point.java public class Point extends Shape

{

protected int x, y; // Tọa độ x, y điểm // constructor không tham số

public Point() {

setPoint( 0, ); }

// constructor có tham số

public Point(int xCoordinate, int yCoordinate) {

setPoint( xCoordinate, yCoordinate ); }

// gán tọa độ x, y cho điểm

public void setPoint( int xCoordinate, int yCoordinate ) {

x = xCoordinate; y = yCoordinate; }

// lấy tọa độ x điểm public int getX()

{

Ngày đăng: 01/04/2021, 16:29

w