Bài giảng Lập trình căn bản - Hướng đối tượng
Truy xuất hiện thực thông qua tham chiếu interface
Bạn có thể khai báo 1 biến tham chiếu tới interface .
Khi bạn gọi phương thức phương thức thực thi sẽ tự động tìm đến thể hiện thực sự.
117 trang |
Chia sẻ: nguyenlam99 | Lượt xem: 1128 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bài giảng Lập trình căn bản - Hướng đối tượng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
HƯỚNG ĐỐI TƯỢNGGV: Nguyễn Thị Tú MiEmail: nguyenthitumi@yahoo.com.vnNội dung2Định nghĩa lớp, đối tượngThuộc tínhPhương thứcKiểm soát truy cậpPhương thức khởi tạoThao tác với đối tượngĐối tượng trong thế giới thực(1)3Một đối tượng là sự miêu tả phần mềm của thực thể trong thế giới thựcVí dụ: ô tô, xe máy, con người, hoaMỗi một thực thể có một số đặc tính và có khả năng thực hiện các hành động nào đó: Ví dụ: Xe ô tô:Có các đặc tính như: màu, cấu tạo, kiểu dángCó các hành động là: lái, tăng gaThực thể thực & đối tượng4Một thực thể trong thế giới thực có 2 đặc điểm quan trọng là:Các đặc tínhCác hành độngMột đối tượng phần mềm tương ứng cũng được đặt trưng bởi: thuộc tính và phương thức:Thuộc tính là những đặc tính thuộc về đối tượng đóPhương thức định nghĩa các hành động của đối tượngThực thể thực đối tượng(1)5Một thực thể được ánh xạ thành 1 đối tượng phần mềm.Ví dụ: đối tượng ô tô:Thuộc tính: màu, nơi sản xuất, đời xeHành động: lái, thay đổi phụ tùng, tăng tốc, thêm phanh,Thực thể thực đối tượng(2)6Kết quả: 1 đối tượng là 1 thực thể trong thế giới thực với các thuộc tính và hành động tương ứngThuộc tính được lưu trong các trường, cũng còn gọi là các biếnCác hành động là các phương thức được định nghĩa, nó cũng còn được gọi là các hàm Ích lợi của việc sử dụng đối tượng:Hiểu được các thực thể trong thế giới thựcÁnh xạ các thuộc tính và hành động của các thực thể trong thế giới thực vào các đối tượng phần mềmĐối tượng7Đối tượng được thao tác thông qua tham chiếuTham chiếu đóng vai trò gần giống như một con trỏĐối tượng phải được tạo ra một cách tường minh bằng toán tử newMyDate d; d = new MyDate(); MyDate myBirthday = d;Lớp(1)8Mỗi lớp là một tập hợp các đối tượng riêng lẻ.Mỗi lớp là một khuôn mẫu hoặc bản thiết kế mà nó định nghĩa trạng thái, hành vi cho tất cả các đối tượng phụ thuộc lớp đó.Các trạng thái, hành vi có thể được ấn định sau khi đối tượng đã được tạoLớp(2)9Ví dụ:Lớp(3)10Lớp được định nghĩa bởiVí dụ:class MyDate {}class class_name {...}So sánh đối tượng và lớp(1)11Lớp mô tả 1 thực thể trong khi đối tượng là một thực thể thực sựĐối tượng thì có thực trong khi lớp là 1 mô hình khái niệmLớp dùng để định nghĩa tất cả các trạng thái hành động cần thiết cho1 đối tượng của lớp đóSo sánh đối tượng và lớp(2)12Lớp là 1 nguyên mẫu (prototype) của đối tượngLớp là lớp tĩnh (static): các thuộc tính của lớp đó không được thay đổiDữ liệu chứa trong 1 đối tượng là độngKhi một đối tượng được tạo ra, nó là 1 khởi tạo riêng biệt của lớpNó tồn tại độc lập với các đối tượng khác và có các trạng thái riêngSo sánh đối tượng và lớp(3)13Phương thức (Methods in Classes)14Phương thức được định nghĩa như là một hành động hoặc một tác vụ thật sự của đối tượngCú phápaccess_specifier modifier datatype method_name(parameter_list){ //body of method} Access specifiers15Đặc tả truy xuấtLớpGói Lớp conToàn thểpublic√√√√protected√√√package private√√private√Data fieldMethodConstructorClass top levelClass nestedInteface top levelInterface nestedabstractNoYesNoYesYesYesYesfinalYes Yes NoYes Yes Yes Yes nativeNoYes NoNoNoNoNoprivateYes Yes Yes NoYes NoYes protectedYes Yes Yes NoYes NoYes publicYes Yes Yes YesYes YesYes staticYes Yes NoNoYes NoYes synchronizedNoYes NoNoNoNoNotransientYesNoNoNoNoNoNovolatiteYesNoNoNoNoNoNostrictfpNoYesNoYesYesYesYesThuộc tính, phương thức và kiểm soát truy cập17class MyDate { private int year, mon, day; public int getYear() { return year; } public void setYear(int y) { this.year = y; } ...}Phương thức getter, setterThuộc tính18MyDate d = new MyDate();...d.year = 2005; // compile errord.setYear(2005);System.out.println(”Year=” + d.getYear());Phương thức khởi tạo (1) (constructor)19Dữ liệu nên được khởi tạo trước khi sử dụng lỗi khởi tạo là một trong các lỗi phổ biến (NullPointerException)Phương thức khởi tạolà phương thức đặc biệt được gọi tự động sau khi tạo ra đối tượngnhằm mục đích chính là khởi tạo cho các thuộc tính của đối tượngPhương thức khởi tạo (2)20Có tên trùng với tên lớpKhông nhận giá trị trả vềMỗi khi đối tượng được tạo ra bởi toán tử new, hệ thống sẽ tự động gọi phương thức khởi tạo.nếu không khai báo, hệ thống sẽ gọi constructor mặc định là một phương thức rỗngPhương thức khởi tạo của lớp dẫn xuất (Derived class constructors)21Có cùng tên với lớp dẫn xuất (subclass)Mệnh đề gọi constructor của lớp cha (superclass) phải là mệnh đề đầu tiên trong constructor của lớp dẫn xuất (subclass)public abstract class Person {protected String id;protected int birthYear;public Person(String id, int birthYear) {this.id = id;this.birthYear = birthYear;}}public class Student extends Person {private double marks;public Student(String id, int birthYear, double marks) {super(id, birthYear);this.marks = marks;}}Ví dụ: Constructor rỗng22class SayMsg {}SayMsg msg = new SayMsg();Ví dụ: Constructor mặc định23class SayMsg { SayMsg() { System.out.println(”Hello”); }}...SayMsg msg = new SayMsg();Ví dụ:24class SayMsg { SayMsg() { System.out.println(”Hello”); } SayMsg(String s) { System.out.println(s); }}...SayMsg msg1 = new SayMsg();SayMsg msg2 = new SayMsg(”Java”);Ví dụ:25class SayMsg { SayMsg(String s) { System.out.println(s); }}...SayMsg msg1 = new SayMsg(); // errorSayMsg msg2 = new SayMsg(””);Copy constructor26Khởi tạo đối tượng bằng một đối tượng khácpublic class MyDate { private int year, month, day; public MyDate() {...} public MyDate(MyDate d) { year = d.year; month = d.month; day = d.day; }...}27MyDate d = new MyDate();d.setYear(2005);d.setMonth(9);d.setDay(12);MyDate openDay = new MyDate(d);MyDate dd = d;dd = new MyDate();Kiểm soát truy cập28public class MyDate { private int year, month, day; public MyDate() {...} public MyDate(MyDate d) { year = d.year; // year = d.getYear(); month = d.month; day = d.day; }...}Xây dựng lớpKhi định nghĩa lớp ta cần định nghĩa:Các thuộc tính (biến)Các hành vi (hàm)Định nghĩa đầy đủ của 1 lớpXây dựng lớpHàm dựng (constructor)Có cùng tên với lớp mà nó thuộc vềĐịnh nghĩa cú pháp để tạo ra 1 đối tượng thuộc lớp đóKhởi gán các giá trị ban đầu (nếu có)Khởi tạo đối tượng:Route route = new Route("New York", "Boston");ClockTime d = new ClockTime(23, 50);DeclarationInstantiationInitializationKhai báoCú pháp Khai báo 1 biến tên name dùng để tham chiếu tới dữ liệu có kiểu là typeType có thể có hai dạng:Primitive typesReference typesVới kiểu khai báo này giá trị của name hoặc là giá trị mặc định do Java khởi gán, hoặc là null.Type name;Ví dụMyClass myObj = new MyClass(); or MyClass myObj;MyParent myObj = new MyClass(); or MyParent myObj;MyInterface myObj = new MyClass(); orMyInterface myObj;Note: MyParent và MyInterface phải là super class của MyClassKhởi tạo đối tượngKhởi tạo đối tượngSử dụng đối tượngBạn có thể sử dụng một đối tượng theo 2 cách:Tham chiếu tới các thuộc tínhVí dụ: System.out.println("Chieu cao cua rectOne: "+ rectOne.height);Triệu gọi các phương thứcVí dụ: System.out.println(“Dien tich cua rectOne: " + rectOne.area());objectReference.variableName;objectReference.methodName(argumentList); Truyền tham đốiJava cung cấp 2 cách để truyền tham đối:Truyền giá trị: (primitive data) chỉ có ý nghĩa và thay đổi trong phương thức. Khi phương thức kết thúc giá trị trở lại giá trị ban đầuTruyền tham chiếu: (object) thay đổi bên trong phương thức sẽ ảnh hưởng tới đối tượng dùng làm tham đối.Truyền tham đối Kết quả???Kết quảBefore modify() d.height = 10dim = 11After modify() d.height = 11Truyền tham đốiKết quả???Kết quảBefore modify():Nguyen Van AAfter modify():Tran Thi BTruyền tham đốiKết quả???Kết quảBefore swap a: 1 , b: 2After swap a: 1 , b: 2Truyền tham đốiKết quả???Nested classesNguyễn Thị Tú MiEmail: nttmi@hcmuaf.edu.vnNested classesNested class là lớp nằm trong lớp khácVí dụclass OuterClass { ... class NestedClass { ... } }Nested classesĐược chia thành 2 dạngStatic nested classesNon-static nested class (inner class)Ví dụclass OuterClass { ... static class StaticNestedClass { ... } class InnerClass { ... } } Nested classesNested class có thể được khai báo là private, public, protected, hay package privateStatic nested classes: không được phép truy xuất tới các thành phần khác của lớp chứaOuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass(); Non-static nested classes (inner classes): được phép truy xuất tới các thành phần khác của lớp chứa, kể cả nếu nó được khai báo là private.InnerclassesNguyễn Thị Tú MiEmail: nttmi@hcmuaf.edu.vnInner classInner class là lớp được định nghĩa trong lớp khác và không thể tồn tại độc lập.Nó có thể truy xuất tới mọi thuộc tính và phương thức của lớp ngoài (kể cả private)Không được phép khai báo bất cứ thành phần nào là staticMyOuter.this tham chiếu tới this của lớp OuterCú pháp của Inner classĐể khởi tạo inner class phải khởi tạo đối tượng lớp chứa trước OuterClass.InnerClass innerObject = outerObject.new InnerClass(); Các loại inner classes:local inner classes anonymous inner classesLocal inner classLớp được định nghĩa bên trong 1 phương thức của lớp khác.Định nghĩa lớp được xem như 1 đoạn lệnhCú pháp của local inner classMethod-Local inner classMethod-Local inner classMethod-local inner class chỉ được dùng sau khi khai báo và chỉ dùng trong phương thức đã khai báo nóMethod-local inner class không được dùng các biến cục bộ của phương thức tạo ra nó (trừ các biến khai báo final). tại sao?Anonymous inner classLớp được khai báo mà không có tên, bên trong 1 đoạn lệnhCác thuộc tính, hàm của nó chỉ được truy xuất ngay tại vị trí nó định nghĩa.Được phép override hàm của super class hoặc định nghĩa hàm mới (sử dụng pt mới này ntn?) Cú pháp Anonymous inner classCú pháp Anonymous inner classQuyền truy xuất – modifiersCó thể sử dụng các modifier như lớp bên ngoài: public, private, protected, package-privateSummaryPackagePackageMột gói thư viện là tập hợp các lớp, các giao tiếp, các kiểu liệt kê và các chú thích.Nó cung cấp các chức năng bảo vệ truy cập và quản lý không gian tênThao tác trên gói có 2 kỹ thuật:KT đặt tênKT điều khiển truy xuấtPackageMột gói là một nhóm các lớp và giao tiếp có quan hệ với nhau được tổ chức như 1 đơn vị trong không gian tên.Gói giúp phân hoạch không gian tên lớp, giao diện thành những vùng dễ quản lý hơn.Đặc điểm góiMột gói có thể có nhiều gói conKhông được có hai thành viên trùng tênTên của gói được viết bằng chữ thườngJava có 2 loại gói:Gói được định nghĩa trướcGói được định nghĩa bởi người dùngĐịnh nghĩa góiĐể tạo 1 gói, ta đặt từ khóa package ngay phát biểu đầu tiên của tập tin nguồn.Nếu bỏ qua khai báo package lớp sẽ được đặt vào gói mặc định.Các bước định nghĩa góiBước 1: lựa chọn tên góiTên gói phải là chữ thườngTên gói không được bắt đầu bằng java hoặc javaxKhông được bắt đầu bằng số hoặc dấu nối (-)Bước 2: tạo thư mục cùng tên với góiJava sử dụng hệ thống thư mục để lưu trữ các gói các lớp được chứa trong thư mục cùng tên PackageName.Các bước định nghĩa góiBước 3: đưa các tập tin nguồn vào trong góiThêm câu lệnh package vào dòng đầu tiên của mã nguồn.Chỉ có duy nhất 1 câu lệnh package đối với mỗi tệp nguồn.Bước 4: biên dịch và chạy ứng dụngKhi biên dịch phải đảm bảo sử dụng tên lớp đầy đủ bao gồm cả tên gói.Dùng dấu chấm để phân biệt một package với package cha của nó.Định nghĩa góiJava xem gốc của cây phân cấp gọi được định nghĩa ở biến môi trường CLASSPATHVí dụ: package java.awt.image; Được lưu trữ trong thư mục Java\awt\image với hệ điều hành WindowsSử dụng góiJava đưa ra phát biểu import để những lớp nào đó hay toàn bộ gói có thể lấy đượccó thể sử dụng lớp trực tiếp qua tên nó mà không cần dùng dấu chấm truy xuất.Trong tập tin Java, khai báo import sẽ đứng liền sau phát biểu package;Sử dụng góiVí dụTất cả các gói chuẩn đều nằm trong gói tên là java phải nhập tên lớp và gói mà bạn muốn sử dụng.Riêng gói java.lang có nhiều chức năng thông dụngđược import ngầm địnhPhát biểu import của gói chỉ có tác dụng trên các thành phần public của nó.Kế thừa - InheritanceKế thừa trong thế giới thựcKế thừa trong thế giới thựcQuá trình truyền các đặc tính và cách cư xử của cha mẹ cho con cái được gọi là kế thừa.Mục đích: tránh tạo ra các đặc tính và hành vi đã có sẵn mà chỉ sử dụng lại những cái có sẵn đó để tạo nên các thực thể mới.Kế thừa trong lập trìnhLà một phần quan trọng và không thể thiếu trong lập trình hướng đối tượng.Kế thừa cho phép bạn định nghĩa một lớp tổng quát nhất, sau đó định nghĩa thêm các lớp mới bằng cách thêm 1 số chi tiết vào lớp tổng quát này.Lớp conDùng từ khóa extends để tạo ra lớp con.Lớp con phải tuân theo 1 số nguyên tắc sau:Chỉ được kế thừa trực tiếp từ 1 lớp duy nhấtNếu nó không có bất kì lớp cha nào thì ngầm định nó kế thừa lớp ObjectLớp con không được kế thừa hàm dựng của lớp cha.Cài đè (Overriding)Khi lớp con có 1 phương thức giống hệt lớp cha, ta gọi đó là cài đè.Mục đích: định nghĩa mới hay thực hiện hành vi khác so với lớp cha.Qui tắc của lớp cài đèDanh sách các đối số phải giống hệt phương thức đã được định nghĩa trên lớp chaKiểu trả về phải giống hoặc là lớp con của kiểu đã định nghĩa trên lớp chaQuyền truy xuất phải yếu hơn (public<protected<default<private)Được phép ném các ngoại lệ dạng uncheck (runtime) cho dù phương thức trên lớp cha co ném ngoại lệ hay khôngĐược phép ném ít ngoại lệ hơnKhông được override các phương thức final hay staticTừ khóa superCho phép lớp con truy cập tới các thành phần ở lớp cha.super trong constructor dùng để truy xuất tới constructor của lớp cha, phải là câu lệnh đầu tiên trong hàm dựng.Nạp chồng phương thứcNạp chồng là khả năng lớp có nhiều phương thức cùng tên Qui tắcDanh sách tham số phải khác nhauCó thể thay đổi kiểu trả vềCó thể thay đổi quyền truy xuấtCó thể khai báo các ngoại lệ mới hay rộng hơnOverload có thể nằm trong cùng 1 lớp hay trong lớp con Ví dụ cho đoạn mã sau:Các khai báo sau là đúng hay sai? Tại sao?Nạp chồng hàm dựngCho phép xây dựng đối tượng bằng nhiều cáchNạp chồng đối với kiểu sốChọn kiểu số nhỏ nhất phù hợpNạp chồng đối với kiểu sốƯu tiên mở rộng kiểu nguyên thủy hơn là boxingNạp chồng đối với kiểu sốLựa chọn hàm có số tham số phù hợp nhấtKết quả là gì?Các lớp bao không thể mở rộng thành các lớp khácMở rộng cho kiểu tham chiếuSo sánh override và overload OverloadOverrideTham sốPhải thay đổiKhông được đổiKiểu trả về Có thể đổiKhông được đổi trừ covarian returnNgoại lệCó thể đổiCó thể giảm bớt hay bỏ điCó thể thêm hay mở rộng các ngoại lệ uncheckQuyền truy xuấtCó thể đổiCó thể yếu hơn Triệu gọiDo kiểu tham chiếu quyết địnhKiểu đối tượng quyết đinh tại thời điểm thực thiCác phương thức trừu tượngPhương thức chỉ có khai báo mà không có cài đặt được gọi là phương thức trừu tượng.Phương thức trừu tượng là phương thức có từ khóa abstractPhương thức trừu tượng phải được khai báo trong abstract class hoặc trong interfacePhương thức trừu tượng không có cặp dấu ngoặc kép ({}) và được kết thúc bằng dấu chấm phẩy (;)Các phương thức trừu tượngAbstract classNguyễn Thị Tú MiEmail: nttmi@hcmuaf.edu.vnLớp trừu tượng (abstract class)Chúng ta có thể tạo ra các lớp cơ sở để tái sử dụng mà không muốn tạo ra đối tượng thực của lớp.Các lớp Point, Circle, Rectangle chung nhau khái niệm cùng là hình vẽ Shape Giải pháp là khai báo lớp trừu tượng (abstract class)Lớp trừu tượng (abstract class)Lớp trừu tượng dùng để tạo ra khung làm việc chung.Không thể tạo đối tượng từ lớp trừu tượng.Ví dụTái sử dụngTồn tại nhiều loại đối tượng có các thuộc tính và hành vi tương tự hoặc liên quan đến nhauPerson, Student, Manager,Xuất hiện nhu cầu sử dụng lại các mã nguồn đã viếtSử dụng lại thông qua copySử dụng lại thông qua quan hệ has_aSử dụng lại thông qua cơ chế “kế thừa”Tái sử dụngCopy mã nguồnTốn công, dễ nhầmKhó sửa lỗi do tồn tại nhiều phiên bảnQuan hệ has_aSử dụng lớp cũ như là thành phần của lớp mớiSử dụng lại cài đặt với giao diện mớiPhải viết lại giao diệnChưa đủ mềm dẻoVí dụ: has_aclass Person { String name; Date bithday; public String getName() { return name; }...}class Employee { Person me; double salary; public String getName() { return me.getName(); }...}Ví dụ: has_aclass Manager { Employee me; Employee assistant; public setAssistant(Employee e) {...} ...}...Manager junior = new Manager();Manager senior = new Manager();senior.setAssistant(junior); // errorKế thừaDựa trên quan hệ is_aThừa hưởng lại các thuộc tính và phương thức đã cóChi tiết hóa cho phù hợp với mục đích sử dụng mớiThêm các thuộc tính mớiThêm hoặc hiệu chỉnh các phương thứcThuật ngữKế thừaLớp cơ sở, lớp chaLớp dẫn xuất, lớp conKế thừa trong Java[public] class DerivedClass extends BaseClass { /* new features goes here */ }Ví dụ:class Employee extends Person { private double salary; public boolean setSalary(double sal) { ... salary = sal; return true; }}Kế thừa trong JavaEmployee e = new Employee();e.setName("John");e.setSalary(3.0);Person-name-birthday+setName()+setBirthday()Employee-salary+setSalary()+getDetail()Thừa kế nhiều tầngPerson-name-birthday+setName+setBirthdayEmployee-salary+setSalary+getDetailManager-rank...Programmer-project...Student-id...Mọi đối tượng đềuthừa kế từ lớp gốc ObjectInterfaces - giao diệnĐịnh nghĩa giao diệnBạn có thể trừu tượng hoàn toàn giao diện của lớp với sự hiện thực của nó nhờ từ khóa interface.Trong interface bạn đặc tả một lớp phải làm gì nhưng không cần biết phải làm thế nào.Interface là tập các khai báo phương thức, hằng mà lớp con kế thừa.Định nghĩa giao diệnInterface có cú pháp tương tự lớp nhưng không có biến thành viên, chỉ có khai báo hằng và các khai báo phương thức.Số lượng lớp hiện thực 1 interface là không hạn chế.1 lớp cũng được hiện thực số lượng tùy ý các interface.Định nghĩa giao diệnĐể hiện thực 1 interface, lớp phải cài đặt đầy đủ tất cả các phương thức mà interface đó định nghĩa.Interface được thiết kế để hỗ trợ phương thức động lúc thực thi chương trình.Định nghĩa giao diệnCú pháp của 1 interfaceHiện thực giao diệnSau khi interface được định nghĩa, 1 hay nhiều lớp có thể hiện thực interface đó.Để hiện thực 1 interface ta dùng từ khóa implements, sau đó cài đặt tất cả các phương thức mà interface đó định nghĩaChú ýCác phương thức hiện thực interface phải khai báo public.Hình thức của phương thức phải giống hệt đặc tả trong interface .Nếu một lớp chứa 1 interface nhưng không hiện thực hết tất cả các phương thứclớp phải khai báo abstract.Đa kế thừaJava không cho phép đa kế thừa từ nhiều lớp cơ sởđảm bảo tính dễ hiểuhạn chế xung đột Nhưng có thể cài đặt đồng thời nhiều giao diệnVí dụinterface Action { void moveTo(int x, int y); void erase(); void draw();}class Circle1 implements Action { int x, y, r; Circle1(int _x, int _y, int _r) { ... } public void erase() {...} public void draw() {...} public void moveTo(int x1, int y1) {...}}Truy xuất hiện thực thông qua tham chiếu interfaceBạn có thể khai báo 1 biến tham chiếu tới interface . Khi bạn gọi phương thức phương thức thực thi sẽ tự động tìm đến thể hiện thực sự.Biến trong giao diệnCó thể dùng các biến trong interface để import các hằng dùng chung cho nhiều lớp.Khi hiện thực các interface này thì các biến trên có tính chất như 1 hằng. Kế thừa giao diệnMột interface có thể được kế thừa từ 1 interface khác bằng từ khóa extends.Khi một lớp hiện thực 1 interface kế thừa 1 interface khác, nó phải cài đặt tất cả các phương thức của cả 2 interface nàyKế thừa giao diệnMột lớp trừu tượng cũng có thể kế thừa 1 interface khác.abstract class Shape implements Action { protected int x, y; public Shape() {...} public Shape(int _x, int _y) {...} public void moveTo(int x1, int y1) { erase(); x = x1; y = y1; draw(); }}Summary117
Các file đính kèm theo tài liệu này:
- phan1_2_1411.pptx