Bài giảng Lập trình hướng đối tượng - Chương 4, Phần 1: Các kỹ thuật xây dựng lớp và sử dụng đối tượng

Chồng phương thức

n Chồng phương thức (Method Overloading): Các

phương thức trong cùng một lớp có thể trùng

tên nhưng chữ ký phải khác nhau:

n Số lượng tham số khác nhau

n Nếu cùng số lượng tham số thì kiểu dữ liệu các tham

số phải khác nhau

n Mục đích:

n Tên trùng nhau để mô tả bản chất công việc

n Thuận tiện cho lập trình vì không cần phải nhớ quá

nhiều tên phương thức mà chỉ cần nhớ một tên và

lựa chọn các tham số cho phù hợp.

Ví dụ 1:

n Phương thức println() trong System.out.println()

có 10 khai báo với các tham số khác nhau:

boolean, char[], char, double, float, int, long,

Object, String, và một không có tham số.

n Không cần sử dụng các tên khác nhau (chẳng

hạn "printString“ hoặc "printDouble“) cho mỗi

kiểu dữ liệu muốn hiển thị.

Bài giảng Lập trình hướng đối tượng - Chương 4, Phần 1: Các kỹ thuật xây dựng lớp và sử dụng đối tượng trang 1

Trang 1

Bài giảng Lập trình hướng đối tượng - Chương 4, Phần 1: Các kỹ thuật xây dựng lớp và sử dụng đối tượng trang 2

Trang 2

Bài giảng Lập trình hướng đối tượng - Chương 4, Phần 1: Các kỹ thuật xây dựng lớp và sử dụng đối tượng trang 3

Trang 3

Bài giảng Lập trình hướng đối tượng - Chương 4, Phần 1: Các kỹ thuật xây dựng lớp và sử dụng đối tượng trang 4

Trang 4

Bài giảng Lập trình hướng đối tượng - Chương 4, Phần 1: Các kỹ thuật xây dựng lớp và sử dụng đối tượng trang 5

Trang 5

Bài giảng Lập trình hướng đối tượng - Chương 4, Phần 1: Các kỹ thuật xây dựng lớp và sử dụng đối tượng trang 6

Trang 6

Bài giảng Lập trình hướng đối tượng - Chương 4, Phần 1: Các kỹ thuật xây dựng lớp và sử dụng đối tượng trang 7

Trang 7

Bài giảng Lập trình hướng đối tượng - Chương 4, Phần 1: Các kỹ thuật xây dựng lớp và sử dụng đối tượng trang 8

Trang 8

Bài giảng Lập trình hướng đối tượng - Chương 4, Phần 1: Các kỹ thuật xây dựng lớp và sử dụng đối tượng trang 9

Trang 9

Bài giảng Lập trình hướng đối tượng - Chương 4, Phần 1: Các kỹ thuật xây dựng lớp và sử dụng đối tượng trang 10

Trang 10

Tải về để xem bản đầy đủ

pdf 22 trang duykhanh 3400
Bạn đang xem 10 trang mẫu của tài liệu "Bài giảng Lập trình hướng đối tượng - Chương 4, Phần 1: Các kỹ thuật xây dựng lớp và sử dụng đối tượng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Lập trình hướng đối tượng - Chương 4, Phần 1: Các kỹ thuật xây dựng lớp và sử dụng đối tượng

Bài giảng Lập trình hướng đối tượng - Chương 4, Phần 1: Các kỹ thuật xây dựng lớp và sử dụng đối tượng
 4.1. Với kiểu dữ liệu tham trị 4.2. Với kiểu dữ liệu tham chiếu
n Các giá trị nguyên thủy không thể thay đổi n Thực ra là truyền bản sao của tham chiếu gốc, chứ 
 khi truyền như một tham số không phải truyền tham chiếu gốc hoặc truyền đối 
 tượng (pass the references by value, not the original 
 reference or the object)
n Phương thức swap này có hoạt động đúng 
 không?
 public void swap(int var1, int var2) { 
 int temp = var1; n Sau khi truyền cho phương thức, đối tượng có ít nhất 2 
 var1 = var2; tham chiếu
 var2 = temp; 
 } 45 46
 4.2. Với kiểu dữ liệu tham chiếu-ví dụ 1 4.2. Với kiểu dữ liệu tham chiếu-ví dụ 1
public class Student { public class Test {
 private int year; public static void change(Student std){
 private String name;
 std.setYear(2000);
 public Student(String name, int year) { }
 this.year = year; public static void main(String[] args) {
 this.name = name; Student std = new Student("Nam", 1990);
 }
 System.out.println(std.getYear());
 public int getYear() { change(std);
 return year; System.out.println(std.getYear());
 } }
 public void setYear(int year) { }
 this.year = year;
 }
} 47 48
 12
 9/18/17
 4.2. Với kiểu dữ liệu tham chiếu-ví dụ 2 Ví dụ
public class Test { public class Point {
 public static void change(Student std){ private double x;
 std = new Student("Hung", 1995); private double y;
 public Point() { }
 }
 public Point(double x, double y) {
 public static void main(String[] args) { this.x = x; this.y = y;
 Student std = new Student("Nam", 1990); }
 System.out.println(std.getYear()); public void setX(double x) { this.x = x; }
 change(std); public void setY(double y) { this.y = y; }
 System.out.println(std.getYear()); public void printPoint() {
 } System.out.println("X: " + x + " Y: " + y);
 }
}
 }
 49 50
 public class Test {
 public static void tricky(Point arg1, Point arg2) {
 arg1.setX(100); arg1.setY(100); n Chỉ có các tham 
 Point temp = arg1; 
 arg1 = arg2; arg2 = temp; chiếu của 
 } phương thức 
 public static void main(String [] args) { được tráo đổi, 
 Point pnt1 = new Point(0,0); 
 Point pnt2 = new Point(0,0); chứ không phải 
 pnt1.printPoint(); pnt2.printPoint(); các tham chiếu 
 System.out.println(); tricky(pnt1, pnt2); gốc
 pnt1.printPoint(); pnt2.printPoint();
 }
 }
 51 52
 13
 9/18/17
 n Ví dụ 2
 4.3. Truyền số lượng tham số tùy ý public Polygon polygonFrom(Point... corners) { 
 int numberOfSides = corners.length; 
 double squareOfSide1, lengthOfSide1; 
n Được gọi là varargs. Cú pháp: squareOfSide1 = (corners[1].x - corners[0].x) 
 n ten_phuong_thuc(Kieu_dl... ten_tham_so) *(corners[1].x - corners[0].x) 
 + (corners[1].y - corners[0].y) 
n Ví dụ 1:
 *(corners[1].y - corners[0].y) ; 
 n Khai báo:
 lengthOfSide1 = Math.sqrt(squareOfSide1); 
 public PrintStream printf(String format, //create & return a polygon connecting the Points 
 Object... args) } 
 n Sử dụng
 n Nhận xét
 n System.out.printf ("%s: %d, %s\n", 
 name, idnum, address); n corners được coi như một mảng
 n System.out.printf ("%s: %d, %s, %s, %s\n", n Phương thức có thể được gọi bằng cách truyền 
 name, idnum, address, phone, email); một mảng hoặc một loạt các tham số truyền vào
 53 54
 Bài tập: Tính tổng số lượng các số 
 nguyên bất kỳ Nội dung
public class Test {
 public static int plus(int... arr) { 1. Chồng phương thức
 int result = 0;
 for (int i : arr) { 2. Thành viên ĐT và thành viên lớp
 result += i;
 3. Quản lý bộ nhớ trong Java
 }
 return result; 4. Truyền tham số cho phương thức
 }
 5. Một số lớp tiện ích trong Java
 public static void main(String[] args) {
 System.out.println(plus(1, 2, 3, 4, 5));
 }
} 55 56
 14
 9/18/17
 5.1. Package trong Java 5.1. Package trong Java (2)
n Package giống như thư mục giúp: 
 n Tổ chức và xác định vị trí lớp dễ dàng và sử n Tên đầy đủ của lớp bao gồm tên gói và tên 
 dụng các lớp một cách phù hợp. lớp:
 n Tránh cho việc đặt tên lớp bị xung đột (trùng 
 tên)
 n Các package khác nhau có thể chứa các lớp có cùng 
 tên
 n Bảo vệ các lớp, dữ liệu và phương thức ở mức 
 rộng hơn so với mối quan hệ giữa các lớp.
n Một package cũng có thể chứa các package 
 khác 57 58
 a. Tham chiếu giữa các lớp a. Tham chiếu giữa các lớp (2)
n Trong cùng 1 package: Sử dụng tên lớp n Lệnh import:
 n Sử dụng lệnh import để khai báo các package hoặc các 
n Khác package: Phải cung cấp tên đầy đủ cho lớp để khi sử dụng không cần nêu tên đầy đủ.
 các lớp được định nghĩa trong package khác. n Ví dụ:
 import javax.swing.JOptionPane;
n Ví dụ:
 public class HelloNameDialog{
public class HelloNameDialog{
 public static void main(String[] args){
 public static void main(String[] args){
 String result;
 String result;
 result = JOptionPane.showInputDialog
 result = javax.swing.JOptionPane.showInputDialog
 (“Hay nhap ten ban:”);
 (“Hay nhap ten ban:”);
 JOptionPane.showMessageDialog(null,
 javax.swing.JOptionPane.showMessageDialog(null,
 ”Xin chao “+ result + “!”);
 ”Xin chao “+ result + “!”);
 System.exit(0);
 }
 }
}
 }
 59 60
 15
 9/18/17
 b. Các package trong Java b. Các package trong Java (2)
•java.applet •javax.rmi
 n
•java.awt •javax.security Các package cơ bản trong Java
•java.beans
 •javax.sound n java.lang 
•java.io •javax.sql
•java.lang •javax.swing n Cung cấp các lớp cơ bản cho thiết kế ngôn ngữ lập trình Java
•java.math •javax.transaction n Bao gồm wrapper classes, String và StringBuffer, Object, ...
•java.net •javax.xml
 n Import ngầm định vào tất cả các lớp
•java.nio •org.ietf.jgss
•java.rmi •org.omg.CORBA n java.util
•java.security
 •org.omg.CosNaming n Bao gồm tập hợp framework, mô hình sự kiện, date time, và 
•java.sql
 •org.omg.Dynamic nhiều tiện ích khác.
•java.text •org.omg.IOP
•java.util •org.omg.Messaging n java.io
•javax.accessibility •org.omg.PortableInterceptor
 n Cung cấp khả năng vào/ra hệ thống với các luồng dữ liệu và hệ 
•javax.crypto
 •org.omg.PortableServer thống file.
•javax.imageio •org.omg.SendingContext
•javax.naming •org.omg.stub.java.rmi
•javax.net •org.w3c.dom
•javax.print •org.xml 61 62
 b. Các package trong Java (3) 5.2. Các lớp bao (Wrapper class)
n Các package cơ bản trong Java n Các kiểu dữ liệu nguyên thủy không có các 
 n java.math phương thức liên quan đến nó.
 n Cung cấp các lớp thực thi các phép toán với số nguyên và các 
 phép toán thập phân
 n Mỗi kiểu dữ liệu nguyên thủy có một lớp 
 n java.sql
 n Cung cấp các API cho phép truy nhập và xử lý dữ liệu được lưu tương ứng gọi là lớp bao:
 trữ trong một nguồn dữ liệu (thường sử dụng cơ sở dữ liệu quan 
 hệ) n Các lớp bao sẽ “gói” dữ liệu nguyên thủy và cung cấp các 
 n javax.swing phương thức thích hợp cho dữ liệu đó.
 n Cung cấp các lớp và giao diện cho phép tạo ra các ứng dụng đồ 
 n Mỗi đối tượng của lớp bao đơn giản là lưu trữ một biến 
 họa.
 đơn và đưa ra các phương thức để xử lý nó.
 n  
 n Các lớp bao là một phần của Java API
 63 64
 16
 9/18/17
5.2. Các lớp bao (2) a. Chuyển đổi kiểu dữ liệu
 n Sử dụng toString() để chuyển các giá trị số thành xâu.
 n Sử dụng Value() để chuyển từ đối tượng của lớp 
 bao thành giá trị nguyên thủy của đối tượng tương ứng
 Float objF = new Float(“4.67”);
 float f = objF.floatValue(); // f=4.67F
 int i = objF.intValue(); //i=4
 n Sử dụng parse() và valueOf() để chuyển xâu 
 thành các giá trị số.
 int i = Integer.parseInt(“123”); //i=123
 double d = Double.parseDouble(“1.5”) ; // d=1.5
 Double objF2 = Double.valueOf(“-36.12”);
 long l = objF2.longValue(); // l=-36L
 65 66
a. Chuyển đổi kiểu dữ liệu (2) b. Các hằng số
 n Boolean n Float
 n Boolean FALSE n float MAX_VALUE
 n Boolean TRUE n float MIN_VALUE
 n Byte n float NaN
 n byte MIN_VALUE n float NEGATIVE_INFINITY
 n byte MAX_VALUE n float POSITIVE_INFINITY
 n Character n Integer
 n int MAX_RADIX n int MIN_VALUE
 n char MAX_VALUE n int MAX_VALUE
 n int MIN_RADIX n Long
 n char MIN_VALUE n long MIN_VALUE
 n Unicode classification constants n long MAX_VALUE
 n Double n Short
 n double MAX_VALUE n short MIN_VALUE
 n double MIN_VALUE n short MAX_VALUE
 n double NaN
 n double NEGATIVE_INFINITY
 n double POSITIVE_INFINITY
 67 68
 17
 9/18/17
 Ví dụ 5.3. Xâu (String)
double d = (new Integer(Integer.MAX_VALUE)). n Kiểu String là một lớp và không phải là kiểu 
 doubleValue();
System.out.println(d); // 2.147483647E9 dữ liệu nguyên thủy
 n Một String được tạo thành từ một dãy các ký 
String input = "test 1-2-3";
int output = 0; tự nằm trong dấu nháy kép:
for (int index=0;index<input.length();index++) { String a = "A String";
 char c = input.charAt(index); String b = "";
 if (Character.isDigit(c))
 output = output * 10 + Character.digit(c, 10); n Đối tượng String có thể khởi tạo theo nhiều 
} cách:
System.out.println(output); // 123 String c = new String();
 String d = new String("Another String");
 String e = String.valueOf(1.23);
 69 70
 String f = null;
 a. Ghép xâu b. Các phương thức của xâu
 String name = "Joe Smith";
n Toán tử + có thể nối các String:
 name.toLowerCase(); // "joe smith"
 String a = "This" + " is a " + "String"; name.toUpperCase(); // "JOE SMITH"
 //a = “This is a String” "Joe Smith ".trim(); // "Joe Smith"
 "Joe Smith".indexOf('e'); // 2
n Các kiểu dữ liệu cơ bản sử dụng trong lời gọi 
 "Joe Smith".length(); // 9
 println() được chuyển đổi tự động sang kiểu "Joe Smith".charAt(5); // 'm'
 String "Joe Smith".substring(5); // "mith"
 "Joe Smith".substring(2,5); // "e S"
 System.out.println("answer = " + 1 + 2 + 3);
 System.out.println("answer = " + (1+2+3));
 à Hai câu lệnh trên có in ra cùng một kết quả?
 71 72
 18
 9/18/17
 c. So sánh hai xâu c. So sánh hai xâu (2)
n oneString.equals(anotherString)
 n Kiểm tra tính tương đương String name = "Joe"; String s1 = new String(“Hello”); s1
 if ("Joe".equals(name))
 n Trả về true hoặc false String s2 = s1; Hello
 name += " Smith";
 (s1==s2) trả về true
 s2
n oneString.equalsIgnoreCase(anotherString)
 n Kiểm tra KHÔNG xét đến ký tự hoa, thường
 String s1 = new String(“Hello”);
 boolean same = "Joe".equalsIgnoreCase("joe");
 String s2 = new String(“Hello”);
n So sánh sẽ gây nhập nhằng
 oneString == anotherString (s1==s2) trả về false s1 Hello
 n So sánh 2 đối tượng
 s2 Hello
 73 74
 d. Điểm đặc biệt của String String Literal vs. String Object
n Khởi tạo String theo 2 cách:
 n String s1 = "Hello"; // String literal
 n Gán 1 giá trị literal
 n String s2 = "Hello"; // String literal
 n Dùng toán tử new (Không khuyến khích dùng)
 n String s3 = s1; // same reference
n Ví dụ:
 n String s4 = new String("Hello"); // String object
 n String str1 = "Java is Hot"; // Implicit construction qua string 
 literal n String s5 = new String("Hello"); // String object
 n str1 is được khai báo là 1 String reference và được khởi tạo 1 giá trị 
 String literal "Java is Hot"
 n String str2 = new String("I'm cool"); // Explicit construction 
 qua toán tử new 
 n str2 được khai báo là 1 String reference và được khởi tạo qua toán 
 tử new.
n String literals được chứa trong 1common pool. 
 n à Cho phép chia sẻ lưu trữ các String với cùng nội dung để 
 tiết kiệm bộ nhớ.
n String objects lưu trữ giá trị trong heap, không tiết kiệm 
 được bộ nhớ 75 76
 19
 9/18/17
 d. Điểm đặc biệt của String (2) 5.4. StringBuffer
String s1 = new String("test");
String s2 = "test"; n String là kiểu bất biến: 
String s3 = String.valueOf("test");
 n Đối tượng không thay đổi giá trị sau khi được tạo 
System.out.println(s1==s2);
System.out.println(s1==s3); ra à Các xâu của lớp String được thiết kế để 
System.out.println(s2==s3); không thay đổi giá trị.
 n Khi các xâu được ghép nối với nhau một đối 
String s4 = new String("test"); tượng mới được tạo ra để lưu trữ kết quả à
String s5 = "test";
String s6 = String.valueOf("test"); Ghép nối xâu thông thường rất tốn kém về bộ 
System.out.println(s1==s4); nhớ.
System.out.println(s2==s5);
System.out.println(s3==s6); n StringBuffer là kiểu biến đổi: 
 n Đối tượng có thể thay đổi giá trị sau khi được tạo 
 77 ra 78
 5.4. StringBuffer (2) 5.4. StringBuffer (3)
 n StringBuffer:
 n Cung cấp các đối tượng xâu có thể thay đổi 
 giá trị à Sử dụng StringBuffer khi:
 n Dự đoán các ký tự trong xâu có thể thay đổi. 
 n Khi xử lý các xâu một cách linh động, ví dụ như 
 đọc dữ liệu text từ một tệp tin.
 n
 String s = new String(“hello”); n Cung cấp các cơ chế hiệu quả hơn cho việc 
 String t = s; xây dựng, ghép nối các xâu:
 s = new String(“goodbye”); n Việc ghép nối xâu thường được các trình biên dịch 
 chuyển sang thực thi trong lớp StringBuffer
 79 80
 20
 9/18/17
 5.4. StringBuffer (4) 5.4. StringBuffer (5)
n Tính biến đổi: Nếu một đối tượng bị biến đổi, n Nếu tạo xâu thông qua vòng lặp thì sử dụng 
 thì tất cả các quan hệ với đối tượng sẽ nhận StringBuffer
 giá trị mới.
 StringBuffer buffer = new StringBuffer(15);
 buffer.append("This is ") ;
 buffer.append("String") ;
 buffer.insert(7," a") ;
 buffer.append('.');
 System.out.println(buffer.length()); // 17
 System.out.println(buffer.capacity()); // 32
 String output = buffer.toString() ;
 System.out.println(output); // "This is a String."
 81 82
 5.5. Lớp Math 5.5. Lớp Math (2)
n java.lang.Math cung cấp các n Hầu hết các hàm nhận tham số 
 thành phần static: kiểu double và giá trị trả về cũng 
 n Các hằng toán học: có kiểu double
 n Math.E n Ví dụ :
 n Math.PI
 n Các hàm toán học:
 n max, min... Math.pow(Math.E, 
 n abs, floor, ceil Math.sqrt(2.0*Math.PI))
 n sqrt, pow, log, exp Hoặc:
 n cos, sin, tan, acos, asin, atan Math.exp(Math.sqrt(2.0*Math.PI))
 n random
 83 84
 21
 9/18/17
 5.6. Lớp System 5.6. Lớp System (2)
n java.lang.System chứa nhiều hàm tiện ích n currentTimeMillis(): Trả về thời gian hiện tại 
 hữu dụng theo millisecond
 n exit(): Kết thúc hoạt động của Java Virtual Machine
 n Kiểm soát vào ra (I/O) chuẩn
 n gc(): Yêu cầu bộ thu gom rác hoạt động
 n Các luồng InputStream in, PrintStreams out và err
 là các thuộc tính của lớp System. n Các phương thức liên quan đến thuộc tính của hệ 
 thống: Lấy các thông tin thuộc tính như phiên bản của 
 n Có thể thiết lập lại nhờ các hàm setIn(), setOut()
 và setErr() Java Runtime Environment version, thư mục cài đặt 
 Java,...
 n arraycopy(): Sao chép mảng hoặc tập con với 
 hiệu năng cao.
 5.6. Lớp System (3) 5.6. Lớp System (4)
import java.util.Properties;
public class PropertiesTest {
 public static void main(String[] args) {
 System.out.println(
 System.getProperty("path.separator"));
 System.out.println(
 System.getProperty("file.separator"));
 System.out.println(
 System.getProperty("java.class.path"));
 System.out.println(
 System.getProperty("os.name"));
 System.out.println(
 System.getProperty("os.version"));
 System.out.println(System.getProperty("user.dir"));
 System.out.println(System.getProperty("user.home"));
 System.out.println(System.getProperty("user.name"));
 }
}
 22

File đính kèm:

  • pdfbai_giang_lap_trinh_huong_doi_tuong_chuong_4_phan_1_cac_ky_t.pdf