Nói thêm về lớp trong java

Nói thêm về lớp trong java

 I. LỚP KẾ THỪA
1. Khai báo kế thừa
Ta có thể sử dụng tính kế thừa tạo lớp tổng quát có những đặc tính chung đại diện cho một tập hợp các đối tượng có cùng mối quan hệ. Sau đó, lớp này có thể được kế thừa bởi một hay nhiều lớp khác và những đặc tính này trở thành những thành những đặc tính của lớp kế thừa
- Lớp được kế thừa gọi là lớp cha (SuperClass : là lớp cha trực tiếp) - Lớp kế thừa gọi là lớp con (SubClass) Lớp con kế thừa tất cả các biến và hàm định nghĩa trong lớp cha
class ClassName extends SuperClass
{ //Member Variables Declarations, Methods
}
- Mặc dù vậy, lớp con không thể truy xuất các thành phần được khai báo private trong lớp cha - Một biến tham chiếu của lớp cha có thể gán để tham chiếu đến một lớp con bất kỳ dẫn xuất từ lớp cha. Khi một tham chiếu đến một lớp con được gán cho biến tham chiếu kiểu lớp cha, ta chỉ có quyền truy xuất những phần được định nghĩa bởi lớp cha. 
2. Viết chồng hàm hay che khuất hàm (Overriding Methods)
Trong phân cấp lớp, khi một hàm của lớp con có cùng tên, và giống nhau về số lượng và kiểu tham đối cũng như kiểu trả về với một hàm ở lớp cha, thì hàm ở lớp con được gọi là viết chồng hàm trong lớp cha. Khi đó hàm của lớp con sẽ che khuất hàm thừa kế từ lớp cha
Tuy nhiên lớp con không được viết chồng hàm hằng (có khai báo final) và hàm lớp trong lớp cha. 
Ví dụ : Tất cả các lớp là hậu duệ của lớp Object. Lớp Object chứa phương thức toString, mà trả về một đối tượng String chứa tên lớp của đối tượng. Hầu hết các lớp con viết chồng phương thức này và in ra một vài điều gì đó có nghĩa cho lớp đó

3. Từ khoá super
Đôi khi bạn không muốn thực hiện viết chồng một phương thức mà chỉ muốn thêm chức năng vào phương thức. Để làm được điều này, bạn gọi phương thức được viết chồng dùng từ khoá super. Từ khoá super dùng khi lớp con cần tham chiếu lớp cha trực tiếp của nó. Super có hai dạng cú pháp : - Dạng 1 : Hàm khởi tạo lớp cha phải được gọi trước hàm khởi tạo của lớp con. Nếu trong định nghĩa hàm khởi tạo ở lớp con không có câu lệnh gọi hàm khởi tạo lớp cha, trình biên dịch Java sẽ tự động đưa vào câu lệnh gọi hàm khởi tạo mặc định của lớp cha có dạng : classname()
Bạn có thể tự thêm lệnh gọi hàm khởi tạo ở lớp cha có dạng như sau :
super(Parameter-List) Parameter-List là danh sách các tham đối cần thiết cho hàm khởi tạo của lớp cha. super() phải luôn luôn là phát biểu đầu tiên được thực hiện trong hàm khởi tạo của lớp con Ví dụ : 
class MyPoint {
int x, y;
MyPoint(int x, int y) {
this.x = x;
this.y = y;
}
void display() {
System.out.print(“x = “+x+”, y = “+y+”\n”);
}
}
class MyPoint2 extends MyPoint {
int z;
String name;
MyPoint2(int x, int y, int z, String name) {
super(x,y); // Khởi tạo 2 biến x, y bằng cách gọi 
this.z = z; // hàm dựng của lớp cha
this.name = name;
}
void display() { // Viết chồng hàm kế thừa từ lớp cha
System.out.print(“x = “+x+”, y = “+y+”, z = “+z+” “+”name :”+name+”\n”);
}
}
- Dạng 2 : dùng để hàm lớp con truy xuất hàm kế thừa từ lớp cha : 
super.Member
Member có thể là phương thức hay biến của đối tượng Ví dụ : Viết lại hàm display() trong class MyPoint2, có gọi hàm kế thừa từ lớp cha :
void display() {
super.display();
System.out.print(”, z = “+z+” “+”name :”+name+”\n”);
}

II. LỚP, PHƯƠNG THỨC TRỪU TƯỢNGTrong trường hợp chúng ta muốn định nghĩa một lớp cha theo một cấu trúc trừu tượng cho trước mà không cần hiện thực đầy đủ các phương thức. Tức là ta muốn tạo một lớp cha có dạng chung cho tất cả các lớp con và để các lớp con hiện thực chi tiết. Khi đó, bạn muốn chắc chắn lớp con có chồng lắp phương thức. Những phương thức phải được chồng lắp trong lớp con gọi là phương thức trừu tượng, được khai báo abstract và không có phần thân phương thức
abstract [Type] MethodName(Parameter-List) ;
Bất kỳ lớp nào chứa một hay nhiều phương thức trừu tượng cũng phải khai báo trừu tượng, sử dụng từ khoá abstract trước từ khoá class. Không thể khởi tạo đối tượng kiểu lớp trừu tượng, vì lớp trừu tượng không được định nghĩa đầy đủ. Do đó, bạn cũng không thể khai báo hàm khởi tạo. Bất kỳ lớp con nào cũng phải hoặc là viết chồng tất cả các phương thức trừu tượng hoặc chính nó lại được khai báo abstract
Ví dụ : Trong các ứng dụng, bạn có thể vẽ đường tròn, hình chữ nhật, đoạn thẳng, đường cong… Mỗi một đối tượng đồ hoạ này đều chứa các thuộc tính (vị trí, nét viền) và hành vi (di chuyển, thay kích thước, vẽ). Bạn có thể khai báo chúng kế thừa lớp Graphic. Tuy nhiên vẽ một đường tròn là hoàn toàn khác với vẽ một hình chữ nhật, nên lớp Graphic được khai báo là lớp trừu tường, chứa các phương thức đã được hiện thực như moveTo, và phương thức trừu tượng như draw
abstract class GraphicObject {
int x, y;
. . .
void moveTo(int newX, int newY) {
. . .
}
abstract void draw();
}
Mỗi một lớp con không trừu tượng của lớp Graphic như Circle, Rectangle sẽ phải cài đặt đầy đủ cho phương thức draw
class Circle extends GraphicObject {
void draw() {
. . .
}
}
class Rectangle extends GraphicObject {
void draw() {
. . .
}
}

III. LỚP HẰNG (KHÔNG KẾ THỪA), HÀM HẰNG (KHỒNG VIẾT CHỒNG)
1. Sử dụng từ khoá final cấm sự chồng lắp
Mặc dù chồng lắp phương thức là một trong những đặc điểm mạnh nhất của Java, tuy nhiên trong vài trường hợp bạn muốn cấm điều này. Để cấm một phương thức lớp con viết chồng phương thức ở lớp cha, bạn đưa từ khoá final vào đầu khai báo
Ví dụ : class Box {
double width; double height; double depth; …
final double volume() { return width * height * depth; } . . .
}

2. Sử dụng từ khoá final cấm sự kế thừa
Muốn khai báo một lớp mà không có lớp con kế thừa, bạn sử dụng từ khoá final. Với một lớp final, thì tất cả các phương thức của nó sẽ là final. 
Ta không thể khai báo một lớp vừa abstract và final vì một lớp trừu tượng là một lớp chưa hoàn chỉnh và phải có lớp con để hiện thực đầy đủ
Ví dụ : final class Box { . . .
}

IV. LỚP LỒNG NHAUCó thể định nghĩa một lớp bên trong một lớp khác. Lớp như vậy gọi là lớp lồng (Nested Class) và được cài đặt như sau : 
class EnclosingClass{ // Lớp bao bên ngoài
. . .
static class StaticNestedClass { // Lớp lồng tĩnh
. . .
}
class InnerClass { // Lớp lồng phi tĩnh hay lớp nội bộ
. . .
}
}
Lớp lồng chỉ được biết bên trong tầm vực của lớp bao bên ngoài. Bộ dịch Java sẽ báo lỗi nếu một đoạn mã bất kỳ bên ngoài lớp bao cố dùng trực tiếp lớp lồng.
Một lớp lồng có quyền truy cập đến các thành viên của lớp bao bên ngoài, thậm chí nếu chúng được khai báo private. Tuy nhiên, lớp bao không thể truy xuất các thành phần của lớp lồng. 
Có hai kiểu lớp lồng : tĩnh và phi tĩnh. 
Lớp lồng tĩnh (static nested class) được bổ sung từ khoá static. Nó không thể tham chiếu trực tiếp đến biến hay phương thức đối tượng được định nghĩa trong lớp bao, mà chỉ dùng chúng thông qua đối tượng. Vì giới hạn này nên lớp lồng tĩnh ít được dùng. Hầu hết các lớp lồng là lớp nội bộ
Lớp lồng phi tĩnh (nonstatic nested class) không bổ sung từ khoá static, còn được gọi là lớp nội bộ (inner class). Nó có thể truy cập trực tiếp đến các biến và phương thức đối tượng. 
class Outer {
int outer_x = 100;
void test() {
Inner inner = new Inner();
inner.display_x();
}
class Inner { // có thể truy xuất trực tiếp biến đối tượng của lớp Outer
int inner_y = 10;
void display_x() { 
System.out.println(“display : outer_x = “ + outer_x);
}
}
void display_y() { // không thể truy xuất biến đối tượng của lớp Inner
System.out.println(“display : inner_y = “ + inner_y); // Error
}
}
class InnerClassDemo {
public static void main(String args[]) {
Outer outer = new Outer();
outer.test();
}
}

Đăng nhận xét