Professional Documents
Culture Documents
1 2
1 2
3 4
3 4
1
1.1. Chồng phương thức 1.1. Chồng phương thức (2)
v Chồng phương thức (Method Overloading): Các v Ví dụ 1:
phương thức trong cùng một lớp có thể trùng tên § Phương thức println() trong System.out.println() có 10 khai
nhưng chữ ký phải khác nhau: 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ố lượng tham số khác nhau số.
§ Nếu cùng số lượng tham số thì kiểu dữ liệu các tham số phải
§ Không cần sử dụng các tên khác nhau (chẳng hạn
khác nhau "printString“ hoặc "printDouble“) cho mỗi kiểu dữ liệu
v Mục đích: muốn hiển thị.
§ Tên trùng nhau để mô tả bản chất công việc
§ Thuận Kệ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.
5 6
5 6
1.1. Chồng phương thức (3) Một số chú ý với chồng phương thức
v Ví dụ 2: v Các phương thức chỉ được xem xét là chồng khi
chúng thuộc cùng một lớp
v Chỉ nên sử dụng kỹ thuật này với các phương thức
class MyDate { có cùng mục đích, chức năng; tránh lạm dụng
int year, month, day;
public boolean setMonth(int m) { …}
v Khi dịch, trình dịch căn cứ vào số lượng hoặc kiểu
public boolean setMonth(String s) { …} dữ liệu của tham số để quyết định gọi phương
} thức nào phù hợp.
public class Test{ à Nếu không chọn được hoặc chọn được nhiều
public static void main(String args[]){
MyDate d = new MyDate(); hơn 1 phương thức thì sẽ báo lỗi.
d.setMonth(9);
d.setMonth(”September”);
}
}
7 8
7 8
2
Thảo luận Thảo luận
v Cho phương thức sau đây: void prt(String s) { System.out.println(s); }
void f1(char x) { prt("f1(char)"); }
public double test(String a, int b)
void f1(byte x) { prt("f1(byte)"); }
v Hãy chọn ra các phương thức chồng cho phương thức
trên: void f1(short x) { prt("f1(short)"); }
1. void test(String b, int a) void f1(int x) { prt("f1(int)"); }
2. public double test(String a) void f1(long x) { prt("f1(long)"); }
3. private int test(int b, String a) void f1(float x) { prt("f1(float)"); }
4. private int test(String a, int b) void f1(double x) { prt("f1(double)"); }
5. double test(double a, int b) v Điều gì xảy ra nếu thực hiện:
6. double test(int b) § f1(5); 5 à int
7. public double test(String a, long b) § char x=‘a’; f1(x);
§ byte y=0; f1(y);
§ float z = 0; f1(z);…
9 10
9 10
Thảo luận Ví dụ
void prt(String s) { System.out.println(s); } class MyClass {
void f2(short x) { prt("f3(short)"); } public void myMethod(int a, long b) {
}
void f2(int x) { prt("f3(int)"); }
public void myMethod(long a, int b) { // overloading
void f2(long x) { prt("f5(long)"); }
}
void f2(float x) { prt("f5(float)"); } }
v Điều gì xảy ra nếu thực hiện:
public class Test {
§ f2(5);
public static void main(String args[]) {
§ char x=‘a’; f2(x);
MyClass m = new MyClass();
§ byte y=0; f2(y);
m.myMethod(); // error do không có method phù hợp
§ float z = 0; f2(z);
m.myMethod(9, 10); // error do có 2 phiên bản method phù hợp
v Điều gì xảy ra nếu gọi f2(5.5)? }
}
Error: cannot find symbol: method f2(double)
11 12
11 12
3
1.2. Chồng phương thức khởi tạo Ví dụ
v Trong nhiều tình huống khác nhau cần khởi tạo public class BankAccount{
private String owner;
đối tượng theo nhiều cách khác nhau private double balance;
v à Cần xây dựng các phương thức khởi tạo khác public BankAccount(){owner = “noname”;}
nhau cho đối tượng theo nguyên lý chồng phương public BankAccount(String o, double b){
13 14
13 14
15 16
15 16
4
Nội dung
//(cont.)
private double degreeToRadian(double degrees) {
return(degrees * Math.PI / 180.0);
}
public void move() {
1. Chồng phương thức
}
move(1); 2. Thành viên ĐT và thành viên lớp
public void move(int steps) {
double angle = degreesToRadians(direction);
3. Truyền tham số cho phương thức
x = x + (double)steps*speed*Math.cos(angle); 4. Một số lớp Nện ích trong Java
y = y + (double)steps*speed*Math.sin(angle);
} 5. Ví dụ và bài tập
public void printLocation() {
System.out.println(name + " is at ("
+ x + "," + y + ").");
}
} //end of Ship class
17 19
17 19
21
20 21
5
Ví dụ - sử dụng thuộc tính và phương thức Ví dụ - sử dụng thuộc tính và phương thức
static lớp JOptionPane static lớp JOptionPane (2)
JOptionPane.showMessageDialog(null,"Ban da thao
tac loi", "Thong bao loi",
v Object[] opwons = { "OK", "CANCEL" };
JOptionPane.ERROR_MESSAGE); v JOpwonPane.showOpwonDialog(null,“Nhan OK de
wep tuc", "Canh bao",
JOpwonPane.DEFAULT_OPTION,
JOpwonPane.WARNING_MESSAGE,null,opwons,op
wons[0]);
JOptionPane.showConfirmDialog(null,"Ban co chac
chan muon thoat?", "Hay lua chon",
JOptionPane.YES_NO_OPTION);
22 23
22 23
obj2.iStatic = 12;
System.out.println(obj1.iStatic + ”,” + obj1.iNonStatic);
}
}
24 25
24 25
6
Ví dụ 2 2.2. Thành viên hằng
public class Demo { v Một thuộc tính/phương thức không thể thay đổi
int i = 0; giá trị/nội dung trong quá trình sử dụng.
void tang(){ i++; } v Cú pháp khai báo:
public static void main(String[] args) { chi_dinh_truy_cap final kieu_du_lieu
tang(); TEN_HANG = gia_tri;
System.out.println("Gia tri cua i la" + v Ví dụ:
i); final double PI = 3.141592653589793;
} public final int VAL_THREE = 39;
private final int[] A = { 1, 2, 3, 4, 5, 6 };
}
26 27
26 27
28 29
28 29
7
Nội dung 3. Truyền tham số cho phương thức
v Có thể sử dụng bất kỳ kiểu dữ liệu nào cho tham
số của phương thức hoặc constructor
§ Kiểu dữ liệu nguyên thủy
1. Chồng phương thức § Kiểu dữ liệu tham chiếu: mảng và đối tượng
2. Thành viên ĐT và thành viên lớp v Ví dụ
3. Truyền tham số cho phương thức
public Polygon polygonFrom(Point[] corners) {
4. Một số lớp tiện ích trong Java // method body goes here
}
5. Ví dụ và bài tập
30 31
30 31
3. Truyền tham số cho phương thức (2) 3.1. Với kiểu dữ liệu tham trị
v Java truyền mọi tham số cho phương thức dưới v Các giá trị nguyên thủy không thể thay đổi khi
dạng giá trị (pass-by-value): Truyền giá trị/bản sao truyền như một tham số
của tham số thực v Phương thức swap này có hoạt động đúng không?
§ Với tham số có kiểu dữ liệu tham trị (kiểu dữ liệu
nguyên thủy): Truyền giá trị/bản sao của các biến public void swap(int var1, int var2) {
int temp = var1;
nguyên thủy truyền vào var1 = var2;
§ Với tham số có kiểu dữ liệu tham chiếu (mảng và đối var2 = temp;
}
tượng): Truyền giá trị/bản sao của tham chiếu gốc
truyền vào
à Thay đổi tham số hình thức không làm ảnh hưởng
đến tham số thực
32 33
32 33
8
3.2. Với kiểu dữ liệu tham chiếu 3.2. Với kiểu dữ liệu tham chiếu-ví dụ 1
public class Student {
v Thực ra là truyền bản sao của tham chiếu gốc, chứ private int year;
không phải truyền tham chiếu gốc hoặc truyền đối private String name;
tượng (pass the references by value, not the original public Student(String name, int year) {
reference or the object) this.year = year;
this.name = name;
}
34 35
34 35
3.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ụ 2
public class Test { public class Test {
public static void change(Student std){ public static void change(Student std){
std.setYear(2000); std = new Student("Hung", 1995);
} }
public static void main(String[] args) { public static void main(String[] args) {
Student std = new Student("Nam", 1990);
Student std = new Student("Nam", 1990);
System.out.println(std.getYear());
System.out.println(std.getYear());
change(std);
change(std);
System.out.println(std.getYear());
System.out.println(std.getYear());
}
} }
}
36 37
36 37
9
Ví dụ public class Test {
public static void tricky(Point arg1, Point arg2) {
public class Point { arg1.setX(100); arg1.setY(100);
private double x; Point temp = arg1;
private double y; arg1 = arg2; arg2 = temp;
public Point() { } }
public static void main(String [] args) {
public Point(double x, double y) { Point pnt1 = new Point(0,0);
this.x = x; Point pnt2 = new Point(0,0);
this.y = y; pnt1.printPoint(); pnt2.printPoint();
} System.out.println(); tricky(pnt1, pnt2);
pnt1.printPoint(); pnt2.printPoint();
public void setX(double x) {
}
this.x = x;
}
}
public void setY(double y) {
this.y = y;
}
public void printPoint() {
System.out.println("X: " + x + " Y: " + y);
}
} 38 39
38 39
40 41
40 41
10
v Ví dụ 2 Bài tập: Tính tổng số lượng các số nguyên
public Polygon polygonFrom(Point... corners) { bất kỳ
int numberOfSides = corners.length; public class Test {
double squareOfSide1, lengthOfSide1; public static int plus(int... arr) {
squareOfSide1 = (corners[1].x - corners[0].x)
int result = 0;
*(corners[1].x - corners[0].x)
for (int i : arr) {
+ (corners[1].y - corners[0].y)
*(corners[1].y - corners[0].y) ; result += i;
lengthOfSide1 = Math.sqrt(squareOfSide1); }
//create & return a polygon connecting the Points return result;
}
}
42 43
42 43
44 45
44 45
11
4.1. Package trong Java (2) a. Tham chiếu giữa các lớp
v Trong cùng 1 package: Sử dụng tên lớp
v Tên đầy đủ của lớp bao gồm tên gói và tên lớp: v Khác package: Phải cung cấp tên đầy đủ cho các
lớp được định nghĩa trong package khác.
v Ví dụ:
public class HelloNameDialog {
public static void main(String[] args){
String result;
result = javax.swing.JOptionPane.
showInputDialog("Hay nhap ten ban:");
javax.swing.JOptionPane.showMessageDialog (null,
"Xin chao "+ result + "!");
}
}
46 47
46 47
a. Tham chiếu giữa các lớp (2) b. Các package trong Java
•javax.rmi
v Lệnh import: •java.applet
•java.awt •javax.security
§ Sử dụng lệnh import để khai báo các package hoặc •java.beans •javax.sound
các lớp để khi sử dụng không cần nêu tên đầy đủ. •java.io •javax.sql
§ Ví dụ: •java.lang •javax.swing
•java.math •javax.transaction
•java.net •javax.xml
•java.nio •org.ietf.jgss
import javax.swing.JOptionPane; •java.rmi •org.omg.CORBA
public class HelloNameDialog { •java.security •org.omg.CosNaming
public static void main(String[] args){ •java.sql •org.omg.Dynamic
String result; •java.text
result = JOptionPane.showInputDialog("Hay nhap ten ban:");
•org.omg.IOP
•java.util •org.omg.Messaging
JOptionPane.showMessageDialog (null, "Xin chao "+ result + "!"); •javax.accessibility
} •org.omg.PortableInterceptor
•javax.crypto
} •org.omg.PortableServer
•javax.imageio
•org.omg.SendingContext
•javax.naming
•org.omg.stub.java.rmi
•javax.net
•javax.print
•org.w3c.dom
•org.xml
48 49
48 49
12
b. Các package trong Java (2) b. Các package trong Java (3)
v Các package cơ bản trong Java v Các package cơ bản trong Java
§ java.lang § java.math
• Cung cấp các lớp cơ bản cho thiết kế ngôn ngữ lập trình Java • Cung cấp các lớp thực thi các phép toán với số nguyên và các
• Bao gồm wrapper classes, String và StringBuffer, Object, ... phép toán thập phân
• Import ngầm định vào tất cả các lớp § java.sql
§ java.util • Cung cấp các API cho phép truy nhập và xử lý dữ liệu được
• Bao gồm tập hợp framework, mô hình sự kiện, date time, và lưu trữ trong một nguồn dữ liệu (thường sử dụng cơ sở dữ
liệu quan hệ)
nhiều tiện ích khác.
§ java.io § javax.swing
• Cung cấp khả năng vào/ra hệ thống với các luồng dữ liệu và • Cung cấp các lớp và giao diện cho phép tạo ra các ứng dụng
đồ họa.
hệ thống file.
§ …
50 51
50 51
4.2. Các lớp bao (Wrapper class) 4.2. Các lớp bao (2)
v Các kiểu dữ liệu nguyên thủy không có các
phương thức liên quan đến nó.
v Mỗi kiểu dữ liệu nguyên thủy có một lớp tương
ứng gọi là lớp bao:
§ Các lớp bao sẽ “gói” dữ liệu nguyên thủy và cung cấp
các phương thức thích hợp cho dữ liệu đó.
§ Mỗi đối tượng của lớp bao đơn giản là lưu trữ một
biến đơn và đưa ra các phương thức để xử lý nó.
§ Các lớp bao là một phần của Java API
52 53
52 53
13
a. Chuyển đổi kiểu dữ liệu a. Chuyển đổi kiểu dữ liệu (2)
v Sử dụng toString() để chuyển các giá trị số thành xâu.
v Sử dụng <type>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
v Sử dụng parse<type>() 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
54 55
54 55
b. Các hằng số Ví dụ
double d = (new Integer(Integer.MAX_VALUE)).
v Boolean v Float
doubleValue();
§ Boolean FALSE § float MAX_VALUE System.out.println(d); // 2.147483647E9
§ Boolean TRUE § float MIN_VALUE
v Byte § float NaN
§ byte MIN_VALUE § float NEGATIVE_INFINITY String input = "test 1-2-3";
§ byte MAX_VALUE § float POSITIVE_INFINITY
v Character v Integer
int output = 0;
§
§
int MAX_RADIX
char MAX_VALUE
§ int MIN_VALUE for (int index=0;index<input.length();index++) {
§ int MAX_VALUE
§ int MIN_RADIX char c = input.charAt(index);
§ char MIN_VALUE v Long
§ Unicode classificaBon constants § long MIN_VALUE if (Character.isDigit(c))
v Double § long MAX_VALUE
output = output * 10 + Character.digit(c, 10);
§ double MAX_VALUE v Short
§ double MIN_VALUE
§ short MIN_VALUE }
§ double NaN
§ double NEGATIVE_INFINITY
§ short MAX_VALUE System.out.println(output); // 123
§ double POSITIVE_INFINITY
56 57
56 57
14
4.3. Xâu (String) a. Ghép xâu
v Toán tử + có thể nối các String:
v Kiểu String là một lớp và không phải là kiểu dữ liệu String a = "This" + " is a " + "String";
nguyên thủy //a = “This is a String”
v Một String được tạo thành từ một dãy các ký tự nằm v Các kiểu dữ liệu cơ bản sử dụng trong lời gọi
trong dấu nháy kép: println() được chuyển đổi tự động sang kiểu String
String a = "A String"; System.out.println("answer = " + 1 + 2 + 3);
System.out.println("answer = " + (1+2+3));
String b = "";
v Đối tượng String có thể khởi tạo theo nhiều cách:
String c = "A String"; à Hai câu lệnh trên có in ra cùng một kết quả?
String d = new String("Another String");
String e = null;
58 59
58 59
60 61
60 61
15
c. So sánh hai xâu (2) d. Điểm đặc biệt của String
v Khởi tạo String theo 2 cách:
String s1 = new String(“Hello”); § Gán 1 giá trị literal
String s2 = s1; s1 § Dùng toán tử new (Không khuyến khích dùng)
(s1==s2) trả về true Hello v Ví dụ:
§ String str1 = "Java is Hot"; // Implicit construcKon qua string literal
s2
• str1 is được khai báo là 1 String reference và được khởi tạo 1 giá trị String
String s1 = new String(“Hello”); literal "Java is Hot"
§ String str2 = new String("I'm cool"); // Explicit construcKon qua
String s2 = new String(“Hello”); toán tử new
(s1==s2) trả về false • str2 được khai báo là 1 String reference và được khởi tạo qua toán tử new.
s1 Hello v String literals được chứa trong 1common pool.
§ à Cho phép chia sẻ lưu trữ các String với cùng nội dung để Kết
kiệm bộ nhớ.
s2 Hello v String objects lưu trữ giá trị trong heap, không wết kiệm
được bộ nhớ
62 63
62 63
String Literal vs. String Object d. Điểm đặc biệt của String (2)
v String s1 = "Hello"; // String literal String s1 = new String("test");
v String s2 = "Hello"; // String literal String s2 = "test";
String s3 = String.valueOf("test");
v String s3 = s1; // same reference
v String s4 = new String("Hello"); // String object System.out.println(s1==s2);
System.out.println(s1==s3);
v String s5 = new String("Hello"); // String object
System.out.println(s2==s3);
64 65
64 65
16
4.4. StringBuffer 4.4. StringBuffer (2)
v String là kiểu bất biến:
§ Đối tượng không thay đổi giá trị sau khi được tạo ra à Các
xâu của lớp String được thiết kế để không thay đổi giá trị.
§ Khi các xâu được ghép nối với nhau một đối tượng mới
được tạo ra để lưu trữ kết quả à Ghép nối xâu thông
thường rất tốn kém về bộ nhớ.
v StringBuffer là kiểu biến đổi:
§ Đối tượng có thể thay đổi giá trị sau khi được tạo ra
66 67
66 67
68 69
68 69
17
4.4. StringBuffer (5) 4.5. Lớp Math
v Nếu tạo xâu thông qua vòng lặp thì sử dụng
StringBuffer
v java.lang.Math cung cấp các thành phần
stawc:
StringBuffer buffer = new StringBuffer(15); § Các hằng toán học:
buffer.append("This is ") ; • Math.E
buffer.append("String") ; • Math.PI
buffer.insert(7," a") ; § Các hàm toán học:
buffer.append('.'); • max, min...
System.out.println(buffer.length()); // 17 • abs, floor, ceil…
System.out.println(buffer.capacity()); // 32 • sqrt, pow, log, exp…
String output = buffer.toString() ; • cos, sin, tan, acos, asin, atan…
System.out.println(output); // "This is a String." • random
70 71
70 71
§ arraycopy(): Sao chép mảng hoặc tập con với hiệu năng
cao.
Math.pow(Math.E,
Math.sqrt(2.0*Math.PI))
Hoặc:
Math.exp(Math.sqrt(2.0*Math.PI))
72
72 73
18
4.6. Lớp System (2) 4.6. Lớp System (3)
import java.util.Properties;
v currentTimeMillis(): Trả về thời gian hiện tại
theo millisecond public class PropertiesTest {
v exit(): Kết thúc hoạt động của Java Virtual public static void main(String[] args) {
Machine System.out.println(System.getProperty("path.separator"));
System.out.println(System.getProperty("file.separator"));
v gc(): Yêu cầu bộ thu gom rác hoạt động System.out.println(System.getProperty("java.class.path"));
v Các phương thức liên quan đến thuộc _nh của hệ System.out.println(System.getProperty("os.name"));
thống: Lấy các thông `n thuộc _nh như phiên bản của System.out.println(System.getProperty("os.version"));
74 75
77
76 77
19
Bài tập 1 Bài tập 2
v Tiếp bài tập 2 của bài học trước, sử dụng thành v Cài đặt phương thức, đầu vào là số lượng bất kỳ
viên lớp để cài đặt đếm số đối tượng của lớp các đối tượng lớp NhanVien, đầu ra là tổng lương
NhanVien được tạo ra tại bất kỳ thời điểm nào, ở của các đối tượng này.
bất kỳ đâu. Cài đặt minh họa cách thức sử dụng.
78 79
78 79
Bài tập 3
v Sử dụng lớp System đếm thời gian phép cộng xâu
nhiều lần với String, và dùng phương thức append
với StringBuffer để so sánh hiệu năng.
80
80
20