Bài giảng Lập trình Java - Chương 3: Lập trình hướng đối tượng trong Java, cung cấp cho người học những kiến thức như: Một số khái niệm; Thiết kế lớp (class); Thuộc tính; Phương thức; Phương thức khởi tạo; Thành viên static; Sự đóng gói; Từ khóa this; Kế thừa; Đa hình; Lớp trừu tượng; Packages & Interfaces.
11/09/2017 Chương NỘI DUNG Giới thiệu Một số khái niệm Thiết kế lớp (class) Thuộc tính Phương thức Phương thức khởi tạo Thành viên static Sự đóng gói Từ khóa this 10 Kế thừa 11.Đa hình 12.Lớp trừu tượng 13.Packages & Interfaces 11/09/2017 Giới thiệu • Các phương pháp lập trình – Step-by-Step Programming – Procedural Programming – Object-Oriented Programming Step-by-Step Programming Giới thiệu • Lập trình bước • Machine Language, Assembly Language 1101011100111101 1010000111011101 0110111011001010 1000100100101011 MOV BX, CS SUB BX, 10h JNE label1 LOOP label2 11/09/2017 Giới thiệu Procedural Programming • Thiết kế top-down • Chương trình chia thành hàm, thủ tục • Ngơn ngữ: Pascal, C Program Proc1 Proc3 Proc2 • Hạn chế: dùng liệu tồn cục, khó phát triển, khó mơ tả thực thể thực tế 55 Giới thiệu Object-Oriented Programming • Chương trình bao gồm đối tượng • Các đối tượng tương tác với thông qua phương thức chúng • Dễ mơ tả thực thể Object A • Dễ phát triển, mở rộng chương trình Object B Object C Object D 66 11/09/2017 Vấn đề tốn (*) Giới thiệu • Cho tập tin lưu tọa độ (x,y) thành phố, bắt đầu số lượng thành phố sau: 50 20 90 60 10 72 74 98 136 150 91 • Viết chương trình hiển thị tọa độ thành phố DrawingPanel, sau đặt “quả bom” với bán kính cho trước tô màu đỏ thành phố phạm vi bị “nổ” Giới thiệu Cách viết không tốt Scanner input = new Scanner(new File("cities.txt")); int cityCount = input.nextInt(); int[] xCoords = new int [cityCount]; int[] yCoords = new int [cityCount]; for (int i = 0; i < cityCount; i++) { xCoords[i] = input.nextInt(); // read each city yCoords[i] = input.nextInt(); } – • Sử dụng song song mảng để lưu tọa độ x y cho thành phố với số 11/09/2017 Giới thiệu Quan sát tốn • Dữ liệu toán tập hợp điểm (Point) cần lưu trữ đối tượng Point – Mỗi Point chứa hai tọa độ x y – So sánh khoảng cách điểm để xem điểm có nằm phạm vi nổ bom hay khơng – Mỗi Point tự vẽ Tạo class Point Một số khái niệm • Lớp (class): kiểu liệu mở rộng định nghĩa, bao gồm: • Danh sách thuộc tính (dữ liệu) • Các phương thức mơ tả hành vi nhóm đối tượng • Đối tượng (object): • Là thể cụ thể lớp, thuộc tính có giá trị xác định • Là biến có kiểu liệu lớp 10 11/09/2017 Ví dụ đối tượng Ipod Một số khái niệm iPod blueprint state: current song volume battery life behavior: power on/off change station/song change volume choose random song creates iPod #1 iPod #2 iPod #3 state: song = "1,000,000 Miles" volume = 17 battery life = 2.5 hrs state: song = "Letting You" volume = battery life = 3.41 hrs state: song = "Discipline" volume = 24 battery life = 1.8 hrs behavior: power on/off change station/song change volume choose random song behavior: power on/off change station/song change volume choose random song behavior: power on/off change station/song change volume choose random song 11 Một số khái niệm Tính trừu tượng (Abstraction) • abstraction: sử dụng đối tượng không cần biết chi tiết thiết kế bên đối tượng • Ví dụ với iPod: 12 11/09/2017 Thiết kế lớp (class) • Từ toán (*) mục 1, ta thiết kế class Point – Định nghĩa kiểu liệu có tên Point – Mỗi đối tượng Point object có hai trường (field) x y – Mỗi đối tượng Point object có số phương thức – Một chương trình client sử dụng đối tượng Point 13 Thiết kế lớp (class) Point objects (desired) – – Point p1 = new Point(5, -2); Point p2 = new Point(); // origin, (0, 0) • Dữ liệu: Field name Description x the point's x-coordinate y the point's y-coordinate • Phương thức: Method name Description setLocation(x, y) Thiết lập tọa độ x, y cho điểm translate(dx, dy) Dịch chuyển tọa độ x y theo độ dời dx, dy distance(p) Tính khoảng cách từ điểm đến điểm p draw(g) Hiển thị tọa độ điểm 14 11/09/2017 Point class Thiết kế lớp (class) Point class state: int x, y behavior: setLocation(int x, int y) translate(int dx, int dy) distance(Point p) draw(Graphics g) Point object #1 state: x = 5, Point object #3 state: x = 18, y = -2 behavior: setLocation(int x, int y) translate(int dx, int dy) distance(Point p) draw(Graphics g) y = 42 behavior: setLocation(int x, int y) translate(int dx, int dy) distance(Point p) draw(Graphics g) Point object #2 state: x = -245, y = 1897 behavior: setLocation(int x, int y) translate(int dx, int dy) distance(Point p) draw(Graphics g) 15 Khai báo lớp Thiết kế lớp (class) • Cú pháp: package pack.name; modifier class ClassName { Khai báo thuộc tính; Khai báo định nghĩa phương thức } • pack.name: tên gói (nếu cần thiết) • modifier: định truy cập (public khơng định) • ClassName: tên lớp 16 11/09/2017 Thiết kế lớp (class) Khai báo lớp Mức truy cập Khai báo lớp public class Point { int x; Tên lớp int y; Thuộc tính x, y } – Lưu ý: lưu code tập tin Point.java – Khai báo chưa có phương thức 17 Thuộc tính (Fields) • Là liệu đối tượng, biến khai báo phạm vi lớp • Cú pháp khai báo: modifier type name; – Modifier: định mức độ truy cập • public: truy cập từ nơi • protected: truy cập từ gói từ lớp • private: truy cập từ lớp • Khơng định: truy cập từ gói – Ví dụ: public class Student { public String name; //name double gpa; // Grade Point Average } 18 11/09/2017 Truy cập liệu đối tượng Fields • Từ lớp khác truy cập field theo cú pháp: – Lấy giá trị field: variable.field – Cập nhật giá trị field: variable.field = value; • Ví dụ: Point p1 = new Point(); Point p2 = new Point(); System.out.println ("the x-coord is " + p1.x); p2.y = 13; 19 Truy cập liệu đối tượng Point Fields • Sử dụng lớp Point lớp khác PointMain.java (client program) public class PointMain { main(String args) { Point p1 = new Point(); p1.x = 7; p1.y = 2; Point p2 = new Point(); p2.x = 4; p2.y = 3; Point.java (class of objects) public class Point { int x; int y; } x y x y } } 20 10 11/09/2017 Từ khóa this • this: dùng để tham chiếu đến thành phần thuộc lớp • Truy cập biến: this.field • Gọi phương thức: this.method(parameters); • Gọi constructor this(parameters); 39 Tránh xung đột tên biến Từ khóa this • Tránh xung đột tham số phương thức trùng với biến thành viên: public class Point { private int x; private int y; // public void setLocation(int x, int y) { this.x = x; this.y = y; } } 40 20 11/09/2017 Từ khóa this Gọi phương thức khởi tạo khác public class Point { private int x; private int y; public Point () { this(0, 0); // calls (x, y) constructor } public Point(int x, int y) { this.x = x; this.y = y; } // } • Lưu ý: constructor gọi constructor khác 41 Lớp Point hoàn chỉnh 42 21 11/09/2017 Lớp Point hoàn chỉnh 43 10 Kế thừa • Là chế cho phép định nghĩa lớp (lớp con) từ lớp có (lớp cha) – Lớp cha (lớp sở): superclass (base class) – Lớp (lớp dẫn xuất): subclass (drived class) • Xây dựng thêm thuộc tính phương thức riêng lớp • Lớp dẫn xuất có hầu hết thành phần giống lớp sở (các phương thức biến thành viên lớp sở), ngoại trừ: – Các thành phần private – Phương thức khởi tạo – Phương thức tĩnh 44 44 22 11/09/2017 10 Kế thừa Lợi ích kế thừa • Phản ánh mối quan hệ lớp • Phản ánh chia sẻ mã lệnh chương trình lớp viết lại mã lệnh 45 45 10 Kế thừa Ví dụ kế thừa Giống Có chân Mơ tả Có mắt Hành Biết ăn động Biết ngủ Khác Chó Chim Có Có mỏ Mơ tả Biết Biết hót Hành sủa Biết bay Biết động chạy 46 46 23 11/09/2017 10 Kế thừa Ví dụ kế thừa (tt) • Hai lớp độc lập Chó Chim có phần mã lệnh bị trùng: có chân, có mắt, biết ăn, biết ngủ • Xây dựng lớp Động vật chứa trường phương thức mô tả đặc điểm hành động giống Chó Chim • Xây dựng hai lớp Chó Chim kế thừa từ lớp Động vật • Bổ sung vào lớp trường phương thức mô tả đặc điểm riêng chúng 47 47 10 Kế thừa Ví dụ kế thừa (tt) Lớp Động vật Mô tả Hành động Có chân Biết ăn Có mắt Biết ngủ Lớp Chó Hành động Biết sủa Có Biết chạy Mơ tả Lớp Chim Hành động Biết hót Có mỏ Biết bay Mô tả 48 48 24 11/09/2017 10 Kế thừa Khai báo lớp kế thừa • Một lớp kế thừa từ lớp khác • Khai báo: sử dụng từ khóa extends • Để gọi phương thức khởi tạo từ lớp cha, sử dụng từ khóa super 49 49 10 Kế thừa Ví dụ kế thừa // File Hinhtron.java public class Hinhtron { protected int bankinh; public Hinhtron ( int bankinh ) { this.bankinh = bankinh; } public int layBankinh () { return bankinh; } public double tinhDientich() { return Math.PI * bankinh * bankinh; } public double tinhChuvi() { return * Math.PI * bankinh; } } 50 50 25 11/09/2017 Ví dụ kế thừa (tt) 10 Kế thừa • Lớp Hinhcau kế thừa từ lớp Hinhtron // File Hinhcau.java public class Hinhcau extends Hinhtron { public Hinhcau( int bankinh ) { super (bankinh); // Goi phương thức khởi tạo cua lop cha } public double tinhDientich() { return 4*Math.PI*bankinh*bankinh; } public double tinhThetich() { return (4.0/3) * Math.PI * bankinh * bankinh * bankinh; } } 51 51 Ví dụ kế thừa (tt) 10 Kế thừa • Sử dụng lớp kế thừa // File KethuaVd.java public class KethuaVd { public static void main(String[] args) { Hinhtron ht = new Hinhtron (10); Hinhcau hc = new Hinhcau (2); System.out.println(“Ban kinh hinh tron: " + ht.layBankinh ()); System.out.println(“Ban kinh hinh cau: " + hc.layBankinh ()); System.out.println(“Dien tich hinh tron: " + ht.tinhDientich ()); System.out.println(“Dien tich hinh cau: " + hc.tinhDientich ()); System.out.println(“The tich hinh cau: " + hc.tinhThetich ()); } } 52 52 26 11/09/2017 11 Đa hình (Polymorphism) • Thể hiện: phương thức có nội dung thực khác đối tượng khác • Phương thức gọi xác định thông qua đối tượng tham chiếu, không thông qua kiểu khai báo tham chiếu • Trong Java, phương thức ln mang tính đa hình 53 11 Đa hình (Polymorphism) Ví dụ đa hình class A { public void method () { System.out.println (“method of A”); } } class B extends A { public void method () { System.out.println(“method of B”); } } class C extends A { public void method () { System.out.println(“method of C”); } } // Sử dụng main A a = new A (); a.method (); a = new B (); a.method (); C c = new C (); a = c; a.method (); // Kết method of A method of B method of C 54 54 27 11/09/2017 12 Lớp trừu tượng (abstract class) • Là lớp sử dụng làm lớp cha cho lớp khác, khơng (instance) • Lớp trừu tượng định nghĩa thuộc tính chung cho lớp • Ví dụ – Lớp Dagiac có phương thức tinhDientich, tinhChuvi – Lớp HinhTamgiac, HinhChunhat kế thừa từ lớp trừu tượng Dagiac • Khai báo lớp trừu tượng: public abstract class ClassName {…} 55 12 Lớp trừu tượng (abstract class) • Lớp trừu tượng thường có phương thức trừu tượng (phương thức không định nghĩa) – public abstract void tinhDientich(); – public abstract void tinhChuvi(); • Các lớp lớp cha trừu tượng phải định nghĩa tất phương thức trừu tượng • Khơng thể tạo đối tượng lớp trừu tượng khai báo biến thuộc kiểu lớp trừu tượng để tham chiếu đến đối tượng thuộc lớp 56 28 11/09/2017 12 Lớp trừu tượng Ví dụ lớp trừu tượng public abstract class Shape { static final double PI = 3.14159; public abstract double getArea(); public abstract double getVolume(); } class Circle extends Shape { double radius; public double getArea() { return PI*radius*radius; } public double getVolume() { return 0; } } 57 13 Packages & Interfaces • Những thành phần chương trình Java: – Gói (Packages) – Giao diện (Interfaces) • Một chương trình Java có phần: – Lệnh khai báo gói (package ) – Lệnh định gói dùng (import) – Khai báo lớp public (một file java chứa public class) – Các lớp khác (classes private to the package) • Tập tin nguồn Java chứa tất vài số phần 58 29 11/09/2017 13 Packages & Interfaces Interfaces • Chương trình Java kế thừa từ lớp thời điểm, thực thi (implements) lúc nhiều Interfaces • interface cần phải thực (implements) • Khai báo: interface InterfaceName { } • Một Interface thường chứa static phương thức public chưa cài đặt • Một Interface kế thừa từ Interface khác 59 13 Packages & Interfaces Interfaces (tt) • Các bước tạo interfacse – Định nghĩa Interface – Biên dịch Interface – Hiện thực Interface • Tính chất interface: – Tất phương thức interface phải public – Các phương thức phải định nghĩa lớp dẫn xuất giao diện 60 30 11/09/2017 13 Packages & Interfaces Interfaces (tt) • Sử dụng interfacse – Một lớp dẫn xuất từ nhiều interface – Nếu lớp dẫn xuất từ interface mà interface dẫn xuất từ interface khác lớp phải định nghĩa tất phương thức có interface – Khi định nghĩa interface kiểu liệu tham chiếu tạo 61 13 Packages & Interfaces Ví dụ Interface • Tạo file PhoneHandler.java package customer.service; public interface PhoneHandler { public void answer (); public boolean forward (int extension); public void takeMessage (String message, String recipient); } • Biên dịch PhoneHandler.class nằm thư mục \customer\service 62 31 11/09/2017 13 Packages & Interfaces Ví dụ Interface • Thực thi interface public class Phone implements PhoneHandler { public void answer() { } public boolean forward (int extension) { } public void takeMessage (String message, String recipient) { } } 63 13 Packages & Interfaces Packages (gói) • Tương tự thư mục lưu trữ lớp, interface gói khác thành viên gói • Ưu điểm Package: – Cho phép tổ chức lớp vào đơn vị nhỏ – Giúp tránh tình trạng trùng lặp đặt tên – Cho phép bảo vệ lớp đối tượng – Tên gói (Package) dùng để nhận dạng chức lớp 64 32 11/09/2017 13 Packages & Interfaces Packages (tt) • Lưu ý tạo gói: – Mã nguồn phải bắt đầu lệnh ‘package’ – Mã nguồn phải nằm thư mục mang tên gói – Tên gói nên bắt đầu ký tự thường (lower case) để phân biệt lớp đối tượng gói – Những lệnh khác phải viết phía dịng khai báo gói “import”, phần định nghĩa lớp đối tượng – Những lớp đối tượng gói cần phải biên dịch – Để sử dụng gói, cần phải import gói vào mã nguồn 65 13 Packages & Interfaces Packages (tt) • Các bước tạo gói (Package) – Khai báo gói – Import gói chuẩn cần thiết – Khai báo định nghĩa lớp đối tượng có gói – Lưu định nghĩa thành tập tin java, biên dịch lớp đối tượng định nghĩa gói 66 33 11/09/2017 13 Packages & Interfaces Packages (tt) • Gói người dùng định nghĩa – Mã nguồn chương trình phải thư mục gói – Để chương trình Java khác sử dụng gói này, import gói vào mã nguồn • Import lớp đối tượng cần dùng • Import tồn gói – Tạo tham chiếu đến thành viên gói 67 34 ... Giới thiệu • Các phương pháp lập trình – Step-by-Step Programming – Procedural Programming – Object-Oriented Programming Step-by-Step Programming Giới thiệu • Lập trình bước • Machine Language,... Object-Oriented Programming • Chương trình bao gồm đối tượng • Các đối tượng tương tác với thông qua phương thức chúng • Dễ mơ tả thực thể Object A • Dễ phát triển, mở rộng chương trình Object B Object... kiểu liệu có tên Point – Mỗi đối tượng Point object có hai trường (field) x y – Mỗi đối tượng Point object có số phương thức – Một chương trình client sử dụng đối tượng Point 13 Thiết kế lớp (class)