Trong phần này chúng ta sẽ tìm hiểu về Interface và class trừu tượng (Abstract Class). Đồng thời phân tích sự giống và khác nhau giữa chúng.
1.1.Khái niệm
Một lớp trừu tượng thì không có thể hiện nghĩa là ta không thể khởi tạo nó bằng toán tử new, và một phương thức trong nó là abstract thì chỉ được đưa ra định nghĩa (khai báo) mà không được thực thi và nó sẽ được override lại trong các lớp con kế thừa. Và trong lớp mà tồn tại phương thức abstract thì lớp đó cũng được định nghĩa abstract.
- Lớp trừu tượng là lớp không có khai báo các thuộc tính thành phần và các phương thức.
- Bất cứ class nào kết thừa abstract class nào đó phải định nghĩa lại các abstract mothods của lớp mà nó thừa kế hoặc không định nghĩa lại nhưng phải ghi lại abstract mothods đó.
- Abstract class là class có chứa các abstract mothods
- Các methods trong abstract class phải khai báo với từ khóa abstract (không giống như interface vì interface mặc định gán abstract cho các mothods)
- Một abstract class có thể chứa cả abstract mothods và các mothods thường.
- Khi một class có chứa abstract mothod thì bắt buộc phải có từ khóa abstract đằng trước tên class đó.
Xét ví dụ sau :
// Đây là một class trừu tượng.
// Nó bắt buộc phải khai báo là abstract vì trong nó có một method trừu tượng
public abstract class ClassA {
// Đây là một method trừu tượng.
// Nó không có thân hàm.
// Method này có access modifier là: public
public abstract void doSomething();
// Method này có access modifier là protected
protected abstract String doNothing();
// Method này không khai báo access modifier
// Nó có access modifier mặc định.
abstract void todo() ;
}
// Đây là một class trừu tượng.
// Chủ động khai báo abstract, mặc dù nó không có method trừu tượng nào.
public abstract class ClassB {
}
Đặc điểm của một class trừu tượng là:
1. Nó được khai báo abstract.
2. Nó có thể khai báo 0, 1 hoặc nhiều method trừu tượng bên trong.
3. Không thể khởi tạo 1 đối tương trực tiếp từ một class trừu tượng.
// Một class AbstractJob (Mô phỏng một công việc)
// Nó khai báo 2 method trừu tượng.
public abstract class AbstractJob {
public AbstractJob() {
}
// Method này trả về tên của công việc.
public abstract String getJobName();
// Method mô tả hành động của công việc
public abstract void doJob();
}
// Class này triển khai hết các method trừu tượng của class cha.
public class JavaCoding extends AbstractJob {
public JavaCoding() {
}
// Method này triển khai method trừu tượng khai báo tại class cha
@Override
public void doJob() {
System.out.println("Excute : ax2+bx+c =0 ");
}
// Method này triển khai method trừu tượng khai báo tại class cha.
// Method này sẽ có thân hàm đầy đủ
// Method trả về tên của công việc.
@Override
public String getJobName() {
return "Java Coder";
}
}
// Class này thừa kế từ class trừu tượng ManualJob
// BuildHouse không khai báo abstract
// Vì vậy nó cần triển khai các method trừu tượng còn lại.
public class BuildHouse extends ManualJob {
public BuildHouse() {
}
// Triển khai method trừu tượng của class cha.
@Override
public void doJob() {
System.out.println("Build a House");
}
}
public class JobDemo {
public static void main(String[] args) {
// Khởi tạo một đối tượng AbstractJob.
// Nó khởi tạo từ cấu tử của class JavaCoding.
AbstractJob job1 = new JavaCoding();
// Gọi method doJob()
job1.doJob();
// method getJobName là trừu tượng trong class AbstractJob
// Nhưng nó đã được triển khai tại một class con nào đó.
// Vì vậy gọi không vấn đề gì.
String jobName = job1.getJobName();
System.out.println("Job Name 1= " + jobName);
// Khởi tạo một đối tượng AbstractJob
// từ cấu tử của class BuildHouse.
AbstractJob job2 = new BuildHouse();
job2.doJob();
String jobName2 = job2.getJobName();
System.out.println("Job Name 2= " + jobName2);
}
}
» Tin mới nhất:
» Các tin khác: