2.4. Đối tượng
Như đã biết một lớp đối tượng được xây dựng từ một tập các đối tượng có cùng chung thuộc tính và phương thức hay lớp đối tượng một thiết kế của các đối tượng, vì vậy về cơ bản một đối tượng được tạo ra từ một lớp đối tượng. Ta có thể tạo được những đối tượng của lớp này bằng câu lệnh:
ClassName ObjectName = new ClassName(); Trong đó:
- ClassName tên của lớp đối tượng
- ObjectName tên của đối tượng muốn tạo
- new từ khóa dùng để tạo đối tượng
- ClassName() hàm tạo của lớp đối tượng đó
Như vậy trong khai báo trên thấy rằng tạo một đối tượng gồm 3 phần
- Phần khai báo (Declaration): phần này khai báo một biến tham chiếu kiểu đối tượng. Cũng có thể tách riêng phần này để tạo ra các biến tham chiếu kiểu đối tượng như sau:
ClassName ObjectName1, ObjectName2, …;
Có thể bạn quan tâm!
- Hàm – Phương Thức (Function – Method) Khái Niệm
- Một Ví Dụ Về Hai Phương Pháp Giải Quyết Oop Và Structured
- Lập trình Java - 9
- Lập trình Java - 11
- Sơ Đồ Thực Hiện Của Xử Lý Ngoại Lệ
- Lập trình Java - 13
Xem toàn bộ 267 trang tài liệu này.
Trong đó ObjectName1,ObjectName2 … là tên của các biến đối tượng muốn tạo từ lớp đối tượng ClassName.
- Phần tạo (Instantiation): Sử dụng từ khóa newlà một phép toán trong Java để tạo ra đối tượng.
- Phần khởi tạo (Initialization):Phép toán new cho phép gọi đến một hàm tạo để khởi tạo giá trị cho một đối tượng.
Phần tạo và khởi tạo cũng có thể tách riêng để tạo các đối tượng như sau: ObjectName = new ClassName();
Ví dụ 2.8:Tạo ra một lớp Point và tạo ra một đối tượng từ lớp đó
public class Point { public int x = 0; public int y = 0;
public Point(int a, int b) { x = a;
y = b;
}
}
Tạo một đối tượng point1 từ lớp Point như sau Point point1 = new Point(23,34);
Hoặc
Point point1;
Point1 = new Point(23,34);
2.5. Thiết lập và hủy
2.5.1. Thiết lập
Phương thức tạo dựng là một phương thức của lớp thường dùng để khởi tạo một đối tượng mới. Thông thường người ta thường sửdụng hàm tạo để khởi gán giá trị cho các thuộc tính của đối tượng và có thể thựchiện một số công việc cần thiết khác nhằm chuẩn bị cho đối tượng mới.
Đặc điểm của phương thức tạo (Construtor)
Hàm tạo có tên trùng với tên của lớp
Phương thức tạo không bao giờ trả về kết quả
Phương thức tạo được java gọi tự động khi một đối tượng của lớp được tạo ra
Phương thức tạo có thể có đối số như các phương thức thông thường khác
Trong một lớp có thể có nhiều phương thức
Ví dụ 2.9: Tạomột lớp phép tính và sử dụng 2 hàm tạo
public class PhepTinh { private int ToanHang1; private int ToanHang2; private char ToanTu;
public void setToanHang1(int ToanHang1) { this.ToanHang1 = ToanHang1;
}
public void setToanHang2(int ToanHang2) { this.ToanHang2 = ToanHang2;
}
public void setToanTu(char ToanTu) { this.ToanTu = ToanTu;
}
public int getToanHang1() { return ToanHang1;
}
public int getToanHang2() { return ToanHang2;
}
public char getToanTu() { return ToanTu;
}
public PhepTinh() { this.ToanHang1=0; this.ToanHang2=0; this.ToanTu='+';
}
public PhepTinh(int ToanHang1, int ToanHang2, char ToanTu) { this.ToanHang1 = ToanHang1;
this.ToanHang2 = ToanHang2; this.ToanTu = ToanTu;
}
public double TinhToan()
{
double giatri; switch(ToanTu)
{
case '+':
giatri = ToanHang1 + ToanHang2 ; break;
case '-':
giatri = ToanHang1 - ToanHang2 ; break;
case '*':
giatri = ToanHang1 * ToanHang2 ; break;
default:
giatri = (double)ToanHang1 / ToanHang2 ; break;
}
return giatri;
}
}
Bây giờ tạo ra 2 đối tượng như sau: PhepTinh pt1 = new PhepTinh(); double a = pt1.TinhToan();
PhepTinh pt2 = new PhepTinh(7,6,‟-‟); double b = pt2.TinhToan(); System.out.print(“a =” + a + “b=” +b); Chạy chương trình cho kết quả là: a=0 b=1 Hàm tạo mặc định (default constructor)
Nếu như trong class không có hàm khởi tạo thì máy ảo java sẽ làm nhiệm vụ gọi ra một default constructor để tạo ra một đối tượng thể hiện của class. Hàm tạo này thực chất không làm gì cả,nếu trong lớp đã có ít nhất một hàm tạo thì hàm tạo mặc định sẽ không được tạora.
2.5.2. Hủy
Java không có phương thức hủy bỏ. Phương thức finalize tương tự nhưphương thức hủy bỏ của C++, tuy nhiên nó không phải là phương thức hủy bỏ. Sởdĩ nó không phải là phương thức hủy bỏ vì khi đối tượng được hủy bỏ thì phươngthức này chưa chắc đã được gọi đến. Phương thức này được gọi đến chỉ khi bộ thurác của Java được
khởi động và lúc đó đối tượng không còn được sử dụng nữa. Dovậy phương thức finalize có thể không được gọi đến
Người lập trình C++ thường sử dụng toán tử new để cấp phát động một đốitượng, nhưng lại thường quên gọi toán tử delete để giải phóng vùng nhớ này khikhông còn dùng đến nữa, điều này làm rò rỉ bộ nhớ đôi khi dẫn đến chương trìnhphải kết thúc một cách bất thường, quả thật đâu là một điều tồi tệ. Trong java takhông cần quan tâm đến điều đó, java có một cơ chế thu rác tự động, nó đủ thôngminh để biết đối tượng nào không dùng nữa, rồi nó tự động thu hồi vùngnhớ dành cho đối tượng đó.
Trong ngôn ngữ C++ khi một đối tượng bị hủy, sẽ có một hàm đượcgọi tự động, hàm này được gọi là huy tử hay còn gọi là hàm huy, thông thườnghàm hủy mặc định là đủ để dọn dẹp, tuy nhiên trong một số trường hợpthì hàm hủy mặc định lại không thể đáp ứng được, do vậy người lập trình C++,phải viết ra hàm hủy riêng để làm việc đó, tuy nhiên java lại không có khái niệmhàm hủy.
2.6. Các đặc tính của lớp
2.6.1. Tính bền vững
Cơchế đóng gói trong lập trình hướng đối tượng giúp chocác đối tượng dấu đi một phần các chi tiết cài đặt, cũng nhưphần dữ liệu cục bộ của nó, và chỉ công bố ra ngoài những gìcần công bố để trao đổi với các đối tượng khác. Hay có thể nói đối tượng là một thành tố hỗ trợ tính đóng gói.
Đơn vị đóng gói cơ bản của ngôn ngữ java là class. Mộtclass định nghĩa hình thức của một đối tượng. Một class định rònhững thành phần dữ liệu và các đoạn mã cài đặt các thao tácxử lý trên các đối tượng dữ liệu đó. Java dùng class để xâydựng những đối tượng. Những đối tượng là những thể hiện(instances) của một class.
Một lớp bao gồm thành phần dữ liệu và thành phần xử lý.Thành phần dữ liệu của một lớp thường bao gồm các biến thànhviên và các biến thể hiện của lớp. Thành phần xử lý là các thaotác trên các thành phần dữ liệu, thường trong java người gọi làphương thức.
Ví dụ 2.10: Tạo ra một lớp mà các thuộc tính của nó là private, nghĩa là các thuộc tính không thể được truy xuất trực tiếp từ bất kỳ đối tượng nào thuộc các lớp nằm ngoài nó.
public class EncapTest{ private String name; private String idNum; private int age;
public int getAge(){ return age;
}
public String getName(){ return name;
}
public String getIdNum(){ return idNum;
}
public void setAge( int newAge){ age = newAge;
}
public void setName(String newName){ name = newName;
}
public void setIdNum( String newId){ idNum = newId;
}
}
Từ một lớp bên ngoài chỉ có thể truy nhập vào các thuộc tính của các đối tượng này thông qua phương thức getters and setters như sau:
public class RunEncap{
public static void main(String args[]){ EncapTest encap = new EncapTest(); encap.setName("James"); encap.setAge(20); encap.setIdNum("12343ms");
System.out.print("Name : " + encap.getName()+ " Age : "+ encap.getAge());
}
only)
}
Các lợi ích của tính đóng gói là
- Có thể tạo ra các thuộc tính của lớp là chỉ đọc(Read-only) hoặc chỉ ghi (Write-
- Một lớp có toàn quyền kiểm soát những gì được lưu trữ trong các thuộc tính mà
lớp khác không được phép tác động.
- Người sử dụng lớp đó không biết được dữ liệu được lưu trữ như thế nào. Một lớp có thể thay đổi kiểu dữ liệu của các thuộc tính mà người sử dụng không cần thay đổi lại mã nguồn của họ
2.6.2. Tính thừa kế
Thừa kế là việc tạo một lớp mới từ một lớp đã biết sao cho các thành phần (fields và methods) của lớp cũ cũng sẽ thành các thành phần (fields và methods) của lớp mới. Khi đó ta gọi lớp mới là lớp thừa kế hay lớp dẫn xuất (derived class) từ lớp cũ (superclass). Có thể lớp cũ cũng là lớp được dẫn xuất từ một lớp nào đấy, nhưng đối với lớp mới vừa tạo thì lớp cũ đó là một lớp siêu lớp trực tiếp (immediate supperclass).
Trong Java để tạo một lớp mới là thừa kế từ một lớp nào đó dùng từ khóa extends cú pháp như sau:
class A extends B
{
// …
}
Trong đó lớp A là lớp con được thừa kế từ lớp B
Ví dụ 2.11: Tạo ra một lớp shape và một lớp tam giác kế thừa từ lớp shape
public class Shape { private String Mau;
private boolean FillMau; public shape() {
this.Mau = "red"; this.FillMau=true;
}
public boolean isFillMau() { return FillMau;
}
public String getMau() { return Mau;
}
public void setFillMau(boolean FillMau) { this.FillMau = FillMau;
}
public void setMau(String Mau) { this.Mau = Mau;
}
public void Inkq()
{
System.out.println("Mau = "+ getMau()); System.out.println("Dổ màu = "+ isFillMau());
}
}
Tạo lớp tam giác kế thừa lớp shape
public class TamGiac extends Shape{ private double canh1;
private double canh2; private double canh3;
public void setCanh1(double canh1) { this.canh1 = canh1;
}
public void setCanh2(double canh2) { this.canh2 = canh2;
}
public void setCanh3(double canh3) {