Saturday, October 10, 2015

[Java] Đa hình trên Java

1. Nạp chồng.
Java cho phép trong cùng một lớp, có thể khai báo nhiều phương thức có cùng tên. Nạp chồng là hiện tượng các phương thức có cùng tên. Có hai kiểu nạp chồng trong Java:
•  Các phương thức của cùng một lớp có cùng tên. Khi hai phương thức của một lớp có cùng tên thì bắt buộc chúng phải có:
-  Hoặc danh sách các tham số khác nhau
-  Hoặc kiểu trả về khác nhau
-  Hoặc kết hợp hai điều kiện trên.
Nếu không, java sẽ không phân biệt được chúng. Ví dụ nếu trong cùng một lớp:
// Chấp nhận được 
 public int add(int x, int y){…} 
 public float add(float x, int y){…} 
 // Không chấp nhận được 
 public int add(int x, int y){…} 
 public int add(int x, int y){…}
•  Phương thức của lớp con có cùng tên với phương thức của lớp cha. Trong trường hợp này, các phương thức nạp chồng có thể có cùng danh sách tham số và có cùng kiểu trả về.
2. Đa hình.
Đa hình là việc triệu gọi đến các phương thức nạp chồng của đối tượng. Khi một phương thức nạp chồng được gọi, chương trình sẽ dựa vào kiểu các tham số và kiểu trả về để gọi phương thức của đối tượng cho phù hợp.
Chương trình 1 minh hoạ việc khai báo nhiều hàm add() để cộng hai số hoặc cộng hai xâu kí tự.
//Chương trình 1
public class Operator
{
 // Cộng hai sốnguyên 
 public int add(int x, int y)
 {
  return (x + y);
 }
 // Cộng hai sốthực 
 public float add(float x, float y)
 {
  return (x + y);
 }
 // Cộng hai chuỗi kí tự
 public String add(String a, String b)
 {
  return (a + b);
 }
 // Hàm main 
 public static void main(String args[])
 {
  Operator myOperator = new Operator();
  System.out.println("The(5 + 19) is " + myOperator.add(5, 19));
  System.out.println("The(\"ab\" + \"cd\") is \""
   + myOperator.add("ab", "cd") + "\"");
 }
}
Chương trình 1 sẽ hiển thị ra hai dòng thông báo:
The (5+19) is 24 
The (‘ab’ + ‘cd’) is ‘abcd’
Trong lớp Operator có hai phương thức cùng tên và cùng có hai tham số đầu vào là add(). Khi chương trình thực thi lệnh myOperator.add(5, 19), chương trình sẽ tự đối chiếu các kiểu tham số, thấy 5 và 19 có dạng gần với kiểu int nhất, nên phương thức add(int, int) sẽ được gọi và trả về giá trị là 24.
Khi chương trình thực thi lệnh myOperator.add(“ab”, “cd”), chương trình sẽ tự đối chiếu các kiểu tham số, thấy ‘ab’ và ‘cd’ có dạng gần với kiểu String nhất, nên phương thức add(String, String) sẽ được gọi và trả về giá trị là ‘abcd’.
Lưu ý:
•  Khi gọi hàm với các kiểu dữ liệu khác với các hàm đã được khai báo, sẽ có sự chuyển đổi kiểu ngầm định diễn ra. Khi không thể thực hiện chuyển đổi kiểu ngầm định, java sẽ phát sinh một thông báo lỗi.
Chẳng hạn, trong chương trình 1, nếu ta thực thi lệnh myOperator.add(4.0f, 5) có dạng add(float, int), chương trình sẽ chuyển ngầm định số nguyên 5 thành float (chuyển từ kiểu int sang float thuộc diện nới rộng kiểu, là kiểu chuyển ngầm định trong java) đểcó thể sử dụng dạng được khai báo add(float, float) và kết quả sẽ là 9.0f. Nếu ta thực thi lệnh myOperator.add(‘ab’, 5) có dạng add(String, int), vì int không thể chuyển ngầm định thành String nên lệnh này sẽ phát sinh lỗi. Để tránh lỗi này, phải chuyển đổi kiểu tường minh cho số 5 thành kiểu String bằng một trong các cách sau:
myOperator.add(“ab”, (new Int(5)).toString()); 
myOperator.add(“ab”, 5 + ””);

3. Case Study về kế thừa và đa hình. 
Trong phần này, chúng ta sẽ viết một chương trình quản lí nhân viên của một công ty. Bao gồm các lớp chính:
•  Lớp Human là một lớp trừu tượng, chỉ có một phương thức duy nhất là show().
•  Lớp Person là lớp kế thừa từ lớp Human, có hai thuộc tính là tên (name) và tuổi (age). Để đóng gói dữ liệu các thuộc tính này có dạng private và các phương thức truy nhập chúng (get và set). Ngoài ra lớp này còn cài đặt phương thức show() kế thừa từ lớp trừu tượng Human.
•  Lớp Employee là lớp kế thừa từ lớp Person, có thêm thuộc tính là lương (salary). Thuộc tính này cũng có dạng private để đóng gói dữ liệu và cần các phương thức truy nhập get/set. Lớp này cài đặt lại phương thức show(). Hơn nữa, lớp Employee còn có thêm hai phương thức addSalary() và addSalary(float) để tính tăng lương cho nhân viên: một phương thức tăng lương theo tỉ lệ mặc định là 10% (không cần tham số), và một phương thức tăng theo giá trị cụ thể đưa vào (cần tham số).
Các phần tiếp theo sẽ trình bày phần cài đặt chi tiết cho các lớp này.
1 Lớp Human
Lớp Human là một lớp trừu tượng, chỉ có một phương thức duy nhất là show(). Đây là nội dung tập tin Human.java.
//Chương trình 2a
abstract class Human
{
 abstract void show();
}
2 Lớp Person
Lớp Person là lớp kế thừa từ lớp Human:
•  Có hai thuộc tính là tên (name) và tuổi (age) có dạng private
•  Các phương thức truy nhập các thuộc tính name (getName() và setName(String)) và age (getAge() và setAge(int)).
•  Cài đặt chồng phương thức show() kế thừa từ lớp trừu tượng Human.
Đây là nội dung tập tin Person.java. 
//Chương trình 2b
class Person extends Human
{
 private String name;
 private int age;
 // Phương thức khởi dựng không có tham số
 public Person()
 {
  super();
  name = “”;
  age = 0;
 }
 // Phương thức khởi dựng có tham số
 public Person(String name, int age)
 {
  this.name = name;
  this.age = age;
 }
 /* Phương thức truy nhập thuộc tính name */
 public String getName()
 {
  return name;
 }
 public void setName(String name)
 {
  this.name = name;
 }
 /* Phương thức truy nhập thuộc tính age */
 public int getAge()
 {
  return age;
 }
 public void setAge(int age)
 {
  this.age = age;
 }
 // Khai báo nạp chồng 
 public void show()
 {
  System.out.println(name + “ is ” + age + “ years old!”);
 }
}

3 Lớp Employee
Lớp Employee là lớp kế thừa từ lớp Person: • Có thêm thuộc tính là lương (salary) cũng có dạng private để đóng gói dữ liệu và cần các phương thức truy nhập get/set. • Lớp này cài đặt lại phương thức show(). • Có thêm hai phương thức addSalary() và addSalary(float) để tính tăng lương cho nhân viên: phương thức addSalary() tăng lương theo tỉ lệ mặc định là 10% (không cần tham số), phương thức addSalary(float) tăng theo giá trị cụ thể đưa vào (cần tham số). Sau đây là nội dung tập tin Employee.java.
//Chương trình 2c
class Employee extends Person
{
 private float salary;
 // Phương thức khởi dựng không có tham số
 public Employee()
 {
  super();
  salary = 0f;
 }
 // Phương thức khởi dựng có tham số
 public Employee(String name, int age, float salary)
 {
  super(name, age);
  this.salary = salary;
 }
 /* Phương thức truy nhập thuộc tính salarry */
 public float getSalary()
 {
  return salary;
 }
 public void setSalary(float salary)
 {
  this.salary = salary;
 }
 // Khai báo nạp chồng 
 public void show()
 {
  System.out.println(getName() + “ is ” + getAge()
   + “ years old having a salary of $”
   + salary + “ / month!”);
 }
 /* Phương thức tăng lương */
 public void addSalary()
 {
  salary = salary*1.1f;
 }
 public void addSalary(float addition)
 {
  salary += addition;
 }
}
Lưu ý: Trong phương thức nạp chồng show() của lớp Employee, ta phải dùng các phương thức public được kế thừa từ lớp Person là getName() và getAge() để truy nhập đến thuộc tính name và age mà không thể truy xuất trực tiếp. Lí do là các thuộc tính name và age có dạng private trong lớp Person nên không thể truy xuất trực tiếp trong các lớp dẫn xuất. Do đó, ta phải truy xuất chúng thông qua các phương thức truy nhập public của lớp Person.
4 Chương trình demo
Chương trình 2d chứa hàm main đểchạy minh hoạ việc sử dụng các lớp Person và Employee.
//Chương trình 2d
public class Casestudy2
{
 // Hàm main 
 public static void main(String args[])
 {
  // Sửdụng lớp Person 
  Person myPerson = new Person(“Vinh”, 25);
  myPerson.show();
  // Sửdụng lớp Employee 
  Employee myEmployee = new Employee(“Vinh”, 25, 300f);
  myEmployee.show();
  // Tăng lương theo mặc định 
  myEmployee.addSalary();
  myEmployee.show();
  // Tăng lương lên $50 
  myEmployee.addSalary(50f);
  myEmployee.show();
 }
}
Chương trình 2d sẽ hiển thị nội dung như sau:
Vinh is 25 years old! 
Vinh is 25 years old having a salary of $300/month! 
Vinh is 25 years old having a salary of $330/month! 
Vinh is 25 years old having a salary of $380/month!
Dòng thứ nhất in ra dòng thông báo theo phương thức show() của lớp Person. Dòng thứ hai cũng
hiển thị thông báo theo phương thức show() của lớp Employee đã được khai báo nạp chồng. Dòng
thứ ba hiển thị thông báo sau khi đã tăng lương theo mặc định (10%) từ 300$ lên 330$. Dòng thứ
tư hiển thị thông báo sau khi tăng lương thêm một lần nữa với lượng tăng là 50$ từ 330$ lên 380$.
Cám ơn bạn đã đọc bài viết này. Hãy chia sẻ bài viết và bình luận ý kiến của bạn ở bên dưới.

Share this

Chào mừng bạn đến với SimpleCodeCJava Blog - Mục đích của chúng tôi khi thành lập blog này là muốn chia sẻ những kiến thức và kinh nghiệm lập trình mà chúng tôi đã học được với mong muốn giúp đỡ mọi người, giúp bạn rút ngắn được thời gian tìm hiểu cũng như việc giải quyết những vấn đề trong lập trình C và Java.

0 Comment to "[Java] Đa hình trên Java"