Bài giảng Lập trình Java - Bài 3: Giao diện, kế thừa
Giao diện là phương tiện ñể giao tiếp
• ðể “lắp ghép” các môñun phần mềm ñược với nhau, các
môñun phải “khớp” với nhau về giao diện.
• Tại sao cần giao diện?
• Mỗi nhóm phát triển một số mô ñun, không phải quan
tâm ñến mã bên trong của các mô ñun do nhóm khác
phát triển, chỉ cần các nhóm thông nhất với nhau về
giao diện
• Phát triển các môñun xử lý chuyên nghiệp và bán cho
các nhà phát triển phần mềm, ví dụ thư viện ñồ họa.
Lê ðình Thanh, Giao diện và kế thừa Lê ðình Thanh Bộ môn Mạng và Truyền thông Máy tính Khoa Công nghệ Thông tin Trường ðại học Công nghệ, ðHQGHN Bài giảng LẬP TRÌNH JAVA Lê ðình Thanh, Giao diện và kế thừa Giao diện, kế thừa Bài 3 Lê ðình Thanh, Giao diện và kế thừa Nội dung • Giao diện • Kế thừa • ða hình • Lớp ảo, phương thức ảo Lê ðình Thanh, Giao diện và kế thừa Giao diện • Giao diện là phương tiện ñể giao tiếp • ðể “lắp ghép” các môñun phần mềm ñược với nhau, các môñun phải “khớp” với nhau về giao diện. • Tại sao cần giao diện? • Mỗi nhóm phát triển một số mô ñun, không phải quan tâm ñến mã bên trong của các mô ñun do nhóm khác phát triển, chỉ cần các nhóm thông nhất với nhau về giao diện • Phát triển các môñun xử lý chuyên nghiệp và bán cho các nhà phát triển phần mềm, ví dụ thư viện ñồ họa. Lê ðình Thanh, Giao diện và kế thừa Giao diện trong Java • ðược ñịnh nghĩa tương tự lớp, nhưng chỉ bao gồm các hằng số và chữ ký phương thức. KHÔNG có thân phương thức. • Không có thể hiện. • Chỉ ñược cài ñặt và mở rộng. public interface OperateCar { // khai báo hằng, nếu có // chữ ký các phương thức int turn(Direction direction, double radius, double startSpeed, double endSpeed); int signalTurn(Direction direction, boolean signalOn); } Lê ðình Thanh, Giao diện và kế thừa Cài ñặt giao diện • Một lớp có thể cài ñặt nhiều giao diện public class OperateBMW760i implements OperateCar { // cài ñặt thân các phương thức int signalTurn(Direction direction, boolean signalOn) { //bật/tắt ñèn trái //bật/tắt ñèn phải } // các phương thức khác không cài ñặt phương thức của giao diện } Lê ðình Thanh, Giao diện và kế thừa Mở rộng giao diện • Một giao diện có thể mở rộng nhiều giao diện khác public interface GroupedInterface extends Interface1, Interface2, Interface3 { double E = 2.718282; void doSomething (int i, double x); int doSomethingElse(String s); } Lê ðình Thanh, Giao diện và kế thừa Sử dụng giao diện • Giao diện ñược sử dụng như một kiểu • Các ñối tượng gán cho biến giao diện phải thuộc lớp cài ñặt giao diện public interface I {} public class A implements I {} public class B {} A a = new A(); B b = new B(); I i = (I) a; //ñúng I i2 = (I) b; //sai Lê ðình Thanh, Giao diện và kế thừa Kế thừa •Một lớp có thể ñược dẫn xuất (derived) từ lớp khác, và do vậy kế thừa (inherit) mọi trường và phương thức của lớp ñó • Lớp ñược kế thừa ñược gọi là lớp cha (superclass, parent class) hoặc lớp cơ sở (base class) • Lớp kế thừa ñược gọi là lớp con (subclass, child class) hoặc lớp dẫn xuất (derived class) hoặc lớp mở rộng (extended class) •Trong java, tất cả các lớp ñều ñược dẫn xuất từ Object. Quan hệ kế thừa tạo thành cây hay cấu trúc phân cấp. Lê ðình Thanh, Giao diện và kế thừa Kế thừa và tính khả kiến • Kế thừa và tính khả kiến • Nếu lớp cha và lớp con ở trong cùng gói, lớp con kế thừa MỌI trường/phương thức public, protected và package-private của lớp cha • Nếu lớp cha và lớp con ở các gói khác nhau, lớp con kế thừa các trường/phương thức public và protected. • Lớp con không kế thừa các trường/phương thức private từ lớp cha Lê ðình Thanh, Giao diện và kế thừa Chồng/che trường/phương thức • Trường lớp con cùng tên trường của lớp cha sẽ che trường của lớp cha. • Phương thức tĩnh của lớp con có chữ ký trùng phương thức tĩnh của lớp cha sẽ che phương thức lớp cha • Phương thức không tĩnh của lớp con có chữ ký trùng phương thức không tĩnh của lớp cha sẽ chồng phương thức lớp cha Lê ðình Thanh, Giao diện và kế thừa Chuyển kiểu trong sử dụng ñối tượng • Có thể sử dụng ñối tượng lớp cha ñể tham chiếu ñến một ñối tượng lớp con (chuyển kiểu ngầm ñịnh) • Object obj = new MountainBike(); • Bicycle byc = new MountainBike(); • Không ñược sử dụng ñối tượng lớp con ñể tham chiếu ñến ñối tượng lớp cha • MountainBike mbike = new Bicycle(); //sai • Nếu muốn sử dụng ñối tượng lớp con ñể tham chiếu ñến ñối tượng lớp cha ñang tham chiếu ñến ñối tượng lớp con, phải có lệnh chuyển kiểu rõ ràng • MountainBike mbike2 = byc; //lỗi • MountainBike mbike3 = (MountainBike) byc; //ok nếu byc ñang tham chiếu ñến ñối tượng MountainBike. Lê ðình Thanh, Giao diện và kế thừa Kiểm tra kiểu của một ñối tượng • if (obj instanceof Class) if (obj instanceof MountainBike) { MountainBike myBike = (MountainBike) obj; } Lê ðình Thanh, Giao diện và kế thừa ða hình • ða hình (polymorphism): Nhiều dạng/kiểu khác nhau của một ñối tượng. • Chồng phương thức, chuyển kiểu ngầm ñịnh là cơ sở của ña hình • ff Bicycle bike01, bike02, bike03; bike01 = new Bicycle(20, 10, 1); bike02 = new MountainBike(20, 10, 5, "Dual"); bike03 = new RoadBike(40, 20, 8, 23); bike01.printDescription(); bike02.printDescription(); bike03.printDescription(); Lê ðình Thanh, Giao diện và kế thừa super – ðại diện của lớp cha • Từ khóa super ñược sử dụng trong cài ñặt lớp con ñể thực hiện các việc sau: • Truy cập các phương thức của lớp cha ñã bị chồng • Truy cập các trường của lớp cha ñã bị che • Thay cho phương thức tạo lớp cha public class Superclass { public void printMethod() { System.out.println("Printed in Superclass."); } } public class Subclass extends Superclass { public void printMethod() { super.printMethod(); System.out.println("Printed in Subclass"); }} public class SubSubClass extends Subclass { public void printMethod() { //Hỏi: Gọi printMethod() của Superclass như thế nào? } Lê ðình Thanh, Giao diện và kế thừa super – ðại diện của lớp cha • Từ khóa super ñược sử dụng trong cài ñặt lớp con ñể thực hiện các việc sau: • Truy cập các phương thức của lớp cha ñã bị chồng • Truy cập các trường của lớp cha ñã bị che • Thay cho phương thức tạo lớp cha public MountainBike(int startHeight, int startCadence, int startSpeed, int startGear) { super(startCadence, startSpeed, startGear); seatHeight = startHeight; } Nếu phương thức tạo của lớp con không gọi phương thức tạo của lớp cha một cách rõ ràng thì phương thức tạo không ñối super() của lớp cha ñược gọi ngầm ñịnh. Lê ðình Thanh, Giao diện và kế thừa final – Ngăn việc kế thừa và chồng • ðể chỉ ñịnh một phương thức không thể bị chồng ở lớp con, sử dụng từ khóa final trước chữ ký phương thức • Cần thiết cho phương thức không nên thay ñổi mã ñể ñảm bảo tính nhất quán • ðể chỉ một lớp không thể kế thừa, sử dụng từ khóa final trước ñịnh nghĩa lớp • Cần ñể tạo các lớp bất biến, ví dụ String class ChessAlgorithm { enum ChessPlayer { WHITE, BLACK } final ChessPlayer getFirstPlayer() { return ChessPlayer.WHITE; } } Lê ðình Thanh, Giao diện và kế thừa Lớp ảo, phương thức ảo • Lớp ảo là lớp ñược ñịnh nghĩa với từ khóa abstract. Lớp ảo không có thể hiện. • Sử dụng làm lớp cha • Phương thức ảo là phương thức ñược ñịnh nghĩa với từ khóa abstract và không có cài ñặt • Cài ñặt phương thức ảo ñược thực hiện ở lớp con với phương thức chồng • Nếu lớp con vẫn không cài ñặt thì phương thức chồng cũng phải là ảo • Lớp chứa phương thức ảo phải là lớp ảo Lê ðình Thanh, Giao diện và kế thừa Sử dụng lớp ảo • Khi có nhiều lớp giống nhau ở một số trường và phương thức (cả chữ ký và thân), và có một số phương thức cùng chữ ký nhưng nhưng khác nhau về thân • Tạo lớp cơ sở ảo với • Các trường và phương thức chung ñược ñịnh nghĩa bình thường • Các phương thức giống nhau chữ ký nhưng khác thân là các phương thức ảo Lê ðình Thanh, Giao diện và kế thừa Lớp ảo, phương thức ảo – Ví dụ abstract class GraphicObject { int x, y; void moveTo(int newX, int newY) {x = newX; y = newY; } abstract void draw(); abstract void resize(); } class Circle extends GraphicObject { void draw() { ... } void resize() { ... } } class Rectangle extends GraphicObject { void draw() { ... } void resize() { ... } } Lê ðình Thanh, Giao diện và kế thừa Câu hỏi kiểm tra public class ClassA { public void methodOne(int i) { } public void methodTwo(int i) { } public static void methodThree(int i) { } public static void methodFour(int i) { } } public class ClassB extends ClassA { public static void methodOne(int i) { } public void methodTwo(int i) { } public void methodThree(int i) { } public static void methodFour(int i) { } } • Phương thức nào chồng phương thức lớp cha? • Phương thức nào che phương thức lớp cha? • Vấn ñề gì với các phương thức khác? Lê ðình Thanh, Giao diện và kế thừa Tiếp theo Số và xâu
File đính kèm:
- Bài giảng Lập trình Java - Bài 3_Giao diện, kế thừa.pdf