Lập trình Java - 9

Bổ nghĩa

Bảng 2.2. Sử dụng các bổ nghĩa

Từ khóa this


Thông thường bên trong thân ca mt phương thc ta có ththam chiếu đến các thuc tính ca đi tượng đó, tuy nhiên trong mt stình hung đc bit như tên ca tham strùng vi tên ca thuc tính, lúc đó đchcác thành viên ca đi tượng đó ta dùng tkhoá this, tkhoá this dùng đchđi tượng này.

Ví d2.2: sau chra cho ta thy trong tình hung này bt buc phi dùng tkhoá this vì tên tham sca phương thc to dng li trùng vi tên ca thuc tính

class HSBColor {

int hue, saturation, brightness;

HSBColor (int hue, int saturation, int brightness) { this.hue = hue;

this.saturation = saturation; this.brightness = brightness;

Có thể bạn quan tâm!

Xem toàn bộ 267 trang tài liệu này.

}

}

Lập trình Java - 9


Ở ví dụ trên có các biên hue, saturation, brightness trung tên vì vậy để phân biệt chúng là thuộc tính hay tham số thì ta phải dùng từ khóa this.

Getter và setter

Trong Java cũng như các ngôn ngữ lập trình hướng đối tượng khác thường thì các thuộc tính không được thiết lập ở chế độ truy cập public vì làm như vậy sẽ làm mất tính bao đóng của các lớp đối tượng và khả năng proteced sẽ bị hạn chế. Chính vì vậy thông thường các thuộc tính được khai báo là private. Tuy nhiên điều này làm cho việc lấy giá trị, cũng như thiết lập các giá trị cho thuộc tính không thể được thực hiện từ các lớp khác ngoài nó. Để giải quyết vấn đề này chúng ta dùng các phương thức getter và setter gọi là các phương thức truy cập.

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.

Đâ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à chỉ nhận 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ể).

Ví dụ 2.3:Định nghĩa một lớp học sinh và xây dựng các phương thức getter và setter để truy cập vào các thuộc tính của lớp này.

class HocSinh {

private String hoTen; private String lop; private float diemTb;

public void setHoTen(String hoTen1) {

//hoTen1 là biến cục bộ nhập vào, thường để trùng tên thuộc tính như các hàm setter phía dưới

this.hoTen = hoTen1;

}

public void setLop(String lop) { this.lop = lop;

}

public String getHoTen() { return hoTen;

}

public String getLop() { return lop;

}

public float getDiemTb() { return diemTb;

}

public void setDiemTb(float diemTb) { this.diemTb = diemTb;

}

}

public class JavaDemo{

public static void main(String[] args) { HocSinh a = new HocSinh(); a.setHoTen("Vu Van T"); a.setLop("At7a"); a.setDiemTb(7.5f);

System.out.println("Họ tên: " + a.getHoTen()); System.out.println("Lớp: " + a.getLop()); System.out.println("Điểm Tb: " + a.getDiemTb());

}

}


Supper

Khi một lớp được kế thừa từ lớp cha trong cả lớp cha và lớp con đều có mô phương thức trùng tên nhau, thế thì làm thế nào có thể gọi phương thức trùng tênđó của lớp cha, java cung cấp cho ta từ khoá Super dùng để chỉ đối tượng của lớpcha

ví dụ 2.4:Xây dựng 2 lớp, một lớp cha và một lớp con có cùng một phương thức và sử dụng Supper để phân biệt giữa các phương thứ này.

class ASillyClass {

boolean aVariable; void aMethod() {

aVariable = true;


}

}

class ASillierClass extends ASillyClass { boolean aVariable;

void aMethod() {

aVariable = false; super.aMethod(); System.out.println(aVariable);

System.out.println(super.aVariable);


}

}


trong ví dụ trên ta thấy trong lớp cha có phương thức tên là aMethod trong lớp concũng có một phương thức cùng tên, ta còn thấy cả hai lớp này cùng có một thuộc tính tên aVariable để có thể truy cập vào các thành viên của lớp cha ta phải dùngtừ khoá super.

Trả về giá trị từ phương thức

Khai báo kiểu giá trị trả về từ lúc khai báo phương thức, bên trongthân của phương thức ta phải sử dụng phát biểu return value; để trả về kết quả,nếu hàm được khai báo kiểu void thì ta chỉ sử dụng phát biểu return; mệnh đềreturn đôi khi còn được dùng để kết thúc một phương thức.

Truyền tham số cho phương thức

Khi ta viết các phương thức, một số phương thức yêu cầu phải có một sốtham số, các tham số của một phương thức được khai báo trong lời khai báophương thức, chúng phải được khai báo chi tiết có bao nhiêu tham số, mỗi tham sốcần phải cung cấp cho chúng một cái tên và kiểu dữ liệu của chúng.

Ví dụ 2.5: Tạo một phương thức dùng để tính tổng của hai số, phương thức này

được


khai báo như sau:

public double tongHaiSo(double a, double b){ return (a + b);

}

Truyền theo tham trị

Khi gọi một phương thức mà tham số của phương thức có kiểu nguyênthủy, thì bản sao giá trị của tham số thực sự sẽ được chuyển đến phương thức, đâylà đặc tính

truyền theo trị ( pass- by – value ), nghĩa là phương thức không thể thayđổi giá trị của các tham số truyền vào.

Ví dụ 2.6: Truyền theo tham trị

public class TestPassByValue { public static void test(int t) { t++;

System.out.println("Gia tri cua cac bien trong ham sau khi tang len 1 la " + t);


}

public static void main(String[] args) { int t = 10;

System.out.println("Gia tri cua t truockhi goi ham = " + t); test(t);

System.out.println("Gia tri cua t sau khi goi ham = " + t);


}

}


ta se nhận được kết quả ra như sau: Gia tri của t truoc khi gọi ham = 10

Gia tri của t bên trong ham sau khi tang len 1 la 11 Gia tri của t sau khi gọi ham = 10

Như vậy giá trị của t trước và sau khi gọi là như nhau, mặc dù ta đã thay đổi giá trị của t trong chương trình nhưng khi thoát khỏi chương trình giá trị của t không thay đổi

Truyền theo tham biến

Trong Java không hỗ trợ việc truyền tham biến cho các tham số thuộc các kiểu dữ liệu nguyên thủy. Để truyền theo tham biến thì tham số phải thuộc về một kiểu dữ liệu tham chiếu nào đó như mảng, đối tượng …

Ví dụ 2.7: Sẽ truyền theo tham biến cho tham số là một mảng

package example; publicclass Start {

publicstaticvoid example(int m[], int n) { for(int i = 0; i < 10; ++i) {

m[i] = 1;

}


n = n + 1;

}


Publicstaticvoid main(String[] args) { int n = 10;

int m[] = newint[10]; for(int i = 0; i < 10; ++i){

m[i] = i;


}

example(m, n);

System.out.print(“n = ” + n +”n”); for(int i = 0; i < 10; ++i){

System.out.print(“m[" + i + "] = ” + m[i] + “n”);


}

}

}


Kết quả như sau: n = 10

m[0] = 1

m[1] = 1

m[2] = 1

m[3] = 1

m[4] = 1

m[5] = 1

m[6] = 1

m[7] = 1

m[8] = 1

m[9] = 1

Qua kết quả cho thấy giá trị của các phần tử của mảng đã bị thay đổi sau khi ta thay đổi trong phương thức example(m, n)

Nạp chồng (overloading) và ghi đè (overriding) phương thức

Những phương thức được nạp chồng (overload) là những phương thức trong cùng một lớp, có cùng một tên song có danh sách các tham số khác nhau. Sử dụng việc nạp chồng phương thức để thực thi các phương thức giống nhau đối với các kiểu dữ liệu khác nhau.Ví dụ phương thức swap() có thể bị nạp chồng (overload) bởi các tham số của kiểu dữ liệu khác nhưinteger, double float

Phương thức được ghi đè (overriden) là phương thức có mặt ở lớp cha (superclass) cũng như ở các lớp kế thừa. Phương thức này cho phép một lớp tổng quát chỉ định các phương thức sẽ là phương thức chung trong các lớp con.Ví dụ lớp xác định phương thức tổng quát „area()‟. Phương thức này có thể được hiện thực trong một lớp con để tìm diện tích một hình cụ thể như hình chữ nhật, hình vuông …

Phương thức nạp chồng là một hình thức đa hình (polymorphism) trong quá trình biên dịch (compiler). Còn phương thức ghi đè là một hình thức đa hình trong quá trình thực thi (runtime).

Đoạn chương trình sau mô tả nạp chồng phương thức được thực hiện như thế nào

//defined once

protected void perfomTask(double salary){

……….

System.out.prinln(“Salary is : ” + salary);

….

}

//overloaded –defined the second time with different parameters protected void performTask(double salary, int bonus){

……

System.out.println(“Total Salary is: ” + salary+bonus);

….

}

Phương thức khởi tạo (Contructor) của lớp có thể bị nạp chồng (overload)

Phương thức ghi đè (Overriden) được định nghĩa lại ở các lớp con. Đoạn mã sau đây mô tả phương thức ghi đè.

Ở đây ta dùng từ khoá “this” biểu thị đối tượng hiện hành, trong khi đó „super‟ được sử dụng để chỉ đối tượng lớp cha.

Phương thức ghi đè không phải là phương thức tĩnh (static). Nó là loại non-static.

Các đoạn mã sau đây mô tả việc thực thi ghi đè phương thức trong Java.

class SupperClass // Tạo lớp cơ bản

{

int a;

SupperClass() // constuctor

{

}

SupperClass(int b) //overloaded constructor

{

a=b;

}

public void message()

{

System.out.println("In the super class");

}

}

class SubClass Extends SupperClass {// derriving a class int a;

SubClass(int a){//subclass constructor this.a;

}

public void message(){ // overiding the base class message() System.out.prinln(“In the sub class”);

}


sau:

}

Bây giờ tạo ra một đối tượng lớp cha và gán một lớp nhỏ tham chiếu đến nó như


SuperClasss spObj=new SubClass(22);

Câu lệnh „spObj.message()‟ thuộc phương thức lớp của SubClass.Ở đây kiểu đối

tượng được gán cho „spObj‟ sẽ chỉ được xác định khi chương trình thực thi. Điều này được biết dưới khái niệm „liên kết động‟ (dynamic binding).

..... Xem trang tiếp theo?
⇦ Trang trước - Trang tiếp theo ⇨

Ngày đăng: 15/07/2022