Truyền tham số và các lời gọi hàm

Một phần của tài liệu Lap Trinh huong doi tuong JAVA (Trang 33 - 39)

 Như phần đầu chúng ta đã đề cập, các đối tượng trong chương trình trao đổi với nhau bằng cách trao đổi các thông điệp

(message). Một thông điệp được cài đặt như là lời gọi hàm (phương thức) trong chương trình, gọi tới hàm thành phần của đối tượng đối tác. Những hàm tĩnh có thể gọi với tên của lớp. Các tham số trong

các lời gọi hàm cung cấp cách thức trao đổi thông tin giữa đối tượng gửi và đối tượng nhận thông điệp.

 Cú pháp các lời gọi hàm có các dạng sau:

<Tham chiếu đối tượng >.<Tên hàm> (<danh

sách tham biến hiện thời>)

<Tên lớp>. <Tên hàm tĩnh> (<danh sách tham

biến hiện thời>)

<Tên hàm> (<danh sách tham biến hiện thời>)

Ví dụ:

hinhTron.ve(); // hinhTron là đối tượng của lớp HinhTron int i = java.lang.Math.abs(-4);// Gọi đầy đủ tên của lớp Math int j = Math.abs(-4); // Gọi theo tên của lớp Math

someMethod(ofValue); // Đối tượng hoặc lớp không tường minh

Hai danh sách hình thức và thực sự phải tương thích với nhau:

 Số các tham biến của danh sách hình thức phải bằng số các tham biến của danh sách thực sự. Kiểu của các tham biến thực sự phải tương thích với kiểu của tham biến hình thức tương ứng. Bảng B3.9 tóm tắt cách truyền các giá trị phụ thuộc vào kiểu của các tham biến hình thức. Bảng B3.9 Truyền tham số

Lưu ý:

 Trong Java, mọi tham biến đều được truyền theo tham trị (passed by value).

Truyền các giá trị kiểu nguyên thủy

 Bởi vì các biến hình thức là cục bộ trong định nghĩa của một hàm nên mọi thay đổi của biến hình thức không ảnh hưởng đến các tham biến thực sự. Các tham biến có thể là các biểu thức và chúng phải được tính trước khi truyền vào lời gọi hàm.

Ví dụ 3.5 Truyền các giá trị nguyên thủy

class KhachHang1{ // Lớp khách hàng public static void main(String[] arg){

HangSX banh = new HangSX(); // Tạo ra một đối tượng int giaBan = 20;

double tien = banh.tinh(10,giaBan);

System.out.println("Gia ban: " + giaBan);// giaBan không đổi System.out.println("Tien ban duoc : " + tien);

} }

gia = gia /2;

return num * gia;// Thay đổi gia nhưng không ảnh hưởng tới giaBan, // nhưng số tiền vẫn bị thay đổi theo

} }

Cơ chế truyền tham biến đối với các giá trị nguyên thủy có thể minh hoạ như sau:

Hình H3-3 mô tả cơ chế truyền tham biến đối với các trị nguyên thủy.

Truyền các giá trị tham chiếu đối tượng

 Khi biến hiện thời tham chiếu tới đối tượng, thì giá trị tham chiếu của đối tượng sẽ được truyền cho biến hình thức. (adsbygoogle = window.adsbygoogle || []).push({});

Ví dụ 3.6 Truyền theo giá trị tham chiếu

//KhachHang2.java

class KhachHang2{ // Lớp khách hàng public static void main(String[] arg){

Banh banhMoi = new Banh(); // Tạo ra một đối tượng (1)

System.out.println("Nhoi thit vao banh truoc khi nuong:" + banhMoi.thit);

nuong(banhMoi); // (2)

System.out.println("Thit cua banh sau khi nuong:"+banhMoi.thit);

}

public static void nuong(Banh banhNuong){ // (3)

banhNuong.thit = “Thit vit”; // Người nướng bánh đổi nhân thành thịt vit

banhNuong = null; // (4) }

}

class Banh{ // Lớp Banh (5)

String thit = “Thit ga”; // Qui định của hãng làm nhân bánh bằng thịt gà

}

Truyền các tham chiếu theo mảng

 Mảng (array) trong Java được xem như là đối tượng. Các phần tử của mảng có thể có kiểu nguyên thủy hoặc kiểu tham chiếu (kiểu lớp).

// Loc.java class Loc{

public static void main(String[] args){

int[] day = {8, 1, 4, 3, 2, 5};// Khởi tạo mảng day và gán trị đầu // Hiển thị các phần tử của dãy trước khi lọc

for (int i = 0; i < day.length; i++) System.out.print(“ “ + day[i]); System.out.println(); // Xuống dòng mới int maxIndex = 0;

// Lọc ra phần tử cực đại và đưa về cuối

for (int index = 1; index < day.length; index++) {

if (day[maxIndex] > day[index]) doiCho(day, maxIndex, index); // (1) maxIndex = index;

}

// Hiển thị dãy sau khi lọc

for (int i = 0; i < day.length; i++) System.out.print(“ “ + day[i]); System.out.println();

banhNuong:Ref(Banh) banhMoi: Ref(Banh) :Banh

thit = “Thit vit” Sau lời gọi hàm, giá trị của tham biến hiện thời ký hiệu cho cùng đối tượng đã bị thay đổi

} (adsbygoogle = window.adsbygoogle || []).push({});

public static void doiCho(int[] bang,int i, int k){ // (2) int tg = bang[i]; bang[i] = bang[k]; bang[k] = tg; }

}

Các tham biến final

 Tham biến hình thức có thể khai báo với từ khóa final đứng trước. Tham biến loại này được gọi là biến cuối “trắng”, nghĩa là nó không được khởi tạo giá trị (là trắng) cho đến khi nó được gán một trị nào đó và khi đã được gán trị thì giá trị đó là cuối cùng, không thay đổi được. Ví dụ 3.8 Sử dụng tham biến final

//KhachHang3.java

class KhachHang3{ // Lớp khách hàng public static void main(String[] arg){

HangSX banh = new HangSX(); // Tạo ra 1 đối tượng int giaBan = 20;

double tien = banh.tinh(10,giaBan);

System.out.println("Gia ban: "+ giaBan);// giaBan không đổi System.out.println("Tien ban duoc : " + tien);

} }

gia = gia /2.0; // (2)

return num * gia;// Thay đổi gia nhưng không ảnh hưởng tới giaBan, // nhưng số tiền vẫn bị thay đổi theo

} }

Các đối số của chương trình

 Giống như chương trình C, chúng ta có thể truyền các tham số cho chương trình trên dòng lệnh, ví dụ:

java TinhTong 12 23 45

 Chương trình java thông dịch lớp TinhTong để tính tổng các đối số 12, 23, 45.

Chương trình TinhTong có thể viết như sau:

Ví dụ 3.9 Truyền tham số cho chương trình

// TinhTong.java class TinhTong{

public static void main(String args[]){ float s = 0.0F;

for (int i = 0; i < args.length; i++)

s += Float.valueOf(args[i]).floatValue(); // Chuyển dãy chữ số thành số

System.out.print(“Tong cua ” + args[0]); for (int i = 1; i < args.length; i++)

System.out.print(“ + ” + args[i]); System.out.println(“ = ” + s);

}

}

Khi thực hiện chương trình cho kết quả

Tong cua 12 + 23 + 45 = 80.00

Bài tập (adsbygoogle = window.adsbygoogle || []).push({});

1. Viết chương trình nhập dữ liệu từ bàn phím dưới dạng các kiểu dữ liệu khác nhau như : char, int, float, double, String. char, int, float, double, String. Hướng dẫn : Coi thêm chương trình ReadData.java với các lưu ý như sau:

o Để nhập dữ liệu cần phải có:

BufferedReader cin = new BufferedReader( new BufferedReader cin = new BufferedReader( new InputStreamReader( System.in ));

o Nhập ký tự:

char c = cin.readLine().charAt(0); char c = cin.readLine().charAt(0);

o Nhập chuỗi ký tự:

String s = cin.readLine();

o Nhập số nguyên int, long

st = new String( cin.readLine() ); st = new String( cin.readLine() ); int i = Interger.parseInt(st); int i = Interger.parseInt(st);

long l = Long.parseLong(st); long l = Long.parseLong(st);

o Nhập số nguyên byte, short: Như kiểu int sau đó chuyển đổi kiểu đến byte và short.

o Nhập số thực float, double, luận lý boolean:

st = new String( cin.readLine() ); st = new String( cin.readLine() ); float f = new Float(st).floatValue(); float f = new Float(st).floatValue();

double d = new Double(st).doubleValue(); boolean b = new Boolean(st).booleanValue();

2. Chương trình tạo dãy số nguyên ngẫu nhiên co giá trị khác nhau. ngẫu nhiên co giá trị khác nhau.

Chương IV: Các lớp cơ sở và các cấu trúc dữ liệu

Nội dung:

 Cấu trúc mảng trong Java;

 Các lớp cơ sở của Java trong gói java.lang: Object, Wrapper, Math

Một phần của tài liệu Lap Trinh huong doi tuong JAVA (Trang 33 - 39)