Bai 08 Đa hình trong java 1 Bài 8 Đa hình 1 Mục tiêu v Giới thiệu về upcasng và downcasng v Phân biệt liên kết =nh và liên kết động v Nắm vững kỹ thuật đa hình v Ví dụ và bài tập về các vấn đề trên với ngôn ng.
Mục tiêu v Giới thiệu upcas/ng downcas/ng v Phân biệt liên kết =nh liên kết động v Nắm vững kỹ thuật đa hình v Ví dụ tập vấn đề với ngôn ngữ lập trình Java Bài 8: Đa hình 2 Nội dung Nội dung 4 Upcas/ng Downcas/ng Liên kết =nh Liên kết động Đa hình (Polymorphism) Ví dụ tập 3 Upcas(ng Downcas(ng Liên kết =nh Liên kết động Đa hình (Polymorphism) Ví dụ tập 4 1 Upcasting Downcasting Upcasting Downcasting v Chuyển đổi kiểu liệu nguyên thủy v Chuyển đổi kiểu liệu tham chiếu § Java tự động chuyển đổi kiểu § Kiểu liệu tham chiếu chuyển đổi kiểu • Kiểu liệu tương thích • Chuyển đổi từ kiểu hẹp sang kiểu rộng • Nằm phân cấp kế thừa A var1 = new B(); § Phải ép kiểu • Kiểu liệu khơng tương thích • Chuyển đổi từ kiểu rộng sang kiểu hẹp int i; byte b = i; A • Kiểu liệu tham chiếu (lớp) tương thích int i; double d = i; A var1 = new A(); C var2 = (C)var1; B § Hai loại chuyển đổi byte b = (byte)i; • Up-casFng • Down-casFng C 5 6 1.1 Upcasting Ví dụ Upcasting v Upcas/ng: lên phân cấp thừa kế (moving up the inheritance hierarchy) v Upcas/ng khả nhìn nhận đối tượng thuộc lớp dẫn xuất đối tượng thuộc lớp sở v Tự động chuyển đổi kiểu - birthday: Date + setName(String) + setBirthday(Date) + getDetails(): String public class Test1 { Employee public static void main(String arg[]) { - salary: double Employee e = new Employee(); Person p; + setSalary(double) p = e; + getDetails(): String p.setName(“Hoa”); p.setSalary(350000); // compile error } 7 Person - name: String 8 Ví dụ Upcasting Ví dụ Upcasting Person class Manager extends Employee { - name: String Employee assistant; - birthday: Date // + setName(String) public void setAssistant(Employee e) { + setBirthday(Date) assistant = e; + getDetails(): String } // Employee } - salary: double public class Test2 { public static void main(String arg[]) { + setSalary(double) + getDetails(): String Manager junior, senior; // senior.setAssistant(junior); Manager } - assistant: Employee } public class Test3 { String static teamInfo(Person p1, Person p2) { return "Leader: " + p1.getName() + ", member: " + p2.getName(); } public static void main(String arg[]) { Employee e1, e2; Manager m1, m2; // System.out.println(teamInfo(e1, e2)); System.out.println(teamInfo(m1, m2)); System.out.println(teamInfo(m1, e2)); } } + setAssistant(Employee) Person - name: String - birthday: Date + setName(String) + setBirthday(Date) + getDetails(): String Employee - salary: double + setSalary(double) + getDetails(): String Manager - assistant: Employee + setAssistant(Employee) + getDetails():String + getDetails():String 9 10 10 1.2 Downcasting Ví dụ Downcasting v Down cas/ng: xuống phân cấp thừa kế (move back down the inheritance hierarchy) v Down cas/ng khả nhìn nhận đối tượng thuộc lớp sở đối tượng thuộc lớp dẫn xuất v Không tự động chuyển đổi kiểu Phải ép kiểu public class Test2 { public static void main(String arg[]) { Employee e = new Employee(); Person p = e; // upcasting Employee ee = (Employee) p; // downcasting Manager m = (Manager) ee; // run-time error Person p2 = new Manager(); Employee e2 = (Employee) p2; Person p3 = new Employee(); Manager e3 = (Manager) p3; } } 11 11 12 12 Toán tử instanceof Nội dung v Kiểm tra xem đối tượng có phải thể lớp khơng v Trả về: true | false (nếu đối tượng null trả false) public class Employee extends Person {} public class Student extends Person {} Upcas/ng Downcas/ng Liên kết 8nh Liên kết động Đa hình (Polymorphism) Ví dụ tập public class Test{ public doSomething(Person e) { if (e instanceof Employee) { } else if (e instanceof Student) { } else { } } } 14 13 13 14 Liên kết lời gọi hàm Trong ngôn ngữ Hướng đối tượng v Liên kết lời gọi hàm (func/on call binding) quy trình xác định khối mã hàm cần chạy lời gọi hàm thực v Liên kết lời gọi phương thức (method call binding): trình liên kết lời gọi phương thức tới đoạn code thực thi phương thức v Có loại: § Ví dụ xử lý liên kết lời gọi hàm C: đơn giản hàm có tên § Liên kết Lnh (staFc binding) § Liên kết động (dynamic binding) 15 15 16 16 2.1 Liên kết tĩnh Ví dụ liên kết tĩnh Java v Liên kết thời điểm biên dịch class Human { public static void walk() { System.out.println("Human walks"); } } public class Boy extends Human { public static void walk() { System.out.println("Boy walks"); } public static void main(String args[]) { // Reference is of Human type and object is Boy type Human obj1 = new Boy(); § Early Binding/Compile-`me Binding § Lời gọi phương thức định biên dịch, có phiên phương thức thực § Nếu có lỗi có lỗi biên dịch § Ưu điểm tốc độ v Ví dụ Java: phương thức sta/c // Reference is of Human type and object is Human type Human obj2 = new Human(); // Reference is of Human type and object is Human type Boy obj3 = new Boy(); obj1.walk(); obj2.walk(); obj3.walk(); } } obj1 = obj3; obj1.walk(); 18 17 17 18 2.2 Liên kết động Ví dụ v Lời gọi phương thức định thực (run-