Xem mẫu

  1. om Bộ môn Công nghệ Phần mềm .c Viện CNTT & TT ng Trường Đại học Bách Khoa Hà Nội co an LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG th o ng Bài 05. Các kỹ thuật xây dựng lớp du u và sử dụng đối tượng cu CuuDuongThanCong.com https://fb.com/tailieudientucntt
  2. Nội dung om Chồng phương thức .c 1. ng 2. Thành viên ĐT và thành viên lớp co Truyền tham số cho phương thức an 3. th Một số lớp tiện ích trong Java ng 4. o du 5. Ví dụ và bài tập u cu 2 CuuDuongThanCong.com https://fb.com/tailieudientucntt
  3. Nội dung om Chồng phương thức .c 1. ng 2. Thành viên ĐT và thành viên lớp co Truyền tham số cho phương thức an 3. th Một số lớp tiện ích trong Java ng 4. o du 5. Ví dụ và bài tập u cu 3 CuuDuongThanCong.com https://fb.com/tailieudientucntt
  4. Nhắc lại về phương thức om ◼ Mỗi phương thức phải có một chữ ký riêng .c ◼ Chữ ký của phương thức bao gồm: ng Tên phương thức co ◼ an ◼ Số lượng các đối số và kiểu của chúng th o ng du u cu 4 CuuDuongThanCong.com https://fb.com/tailieudientucntt
  5. 1.1. Chồng phương thức Chồng phương thức (Method Overloading): Các om ◼ phương thức trong cùng một lớp có thể trùng .c tên nhưng chữ ký phải khác nhau: ng co ◼ Số lượng tham số khác nhau an ◼ Nếu cùng số lượng tham số thì kiểu dữ liệu các tham th số phải khác nhau ng ◼ Mục đích: o du ◼ Tên trùng nhau để mô tả bản chất công việc u Thuận tiện cho lập trình vì không cần phải nhớ quá cu ◼ 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 CuuDuongThanCong.com https://fb.com/tailieudientucntt
  6. 1.1. Chồng phương thức (2) om ◼ Ví dụ 1: .c ◼ Phương thức println() trong System.out.println() ng có 10 khai báo với các tham số khác nhau: co boolean, char[], char, double, float, int, long, an Object, String, và một không có tham số. th Không cần sử dụng các tên khác nhau (chẳng ng ◼ o hạn "printString“ hoặc "printDouble“) cho mỗi du kiểu dữ liệu muốn hiển thị. u cu 6 CuuDuongThanCong.com https://fb.com/tailieudientucntt
  7. 1.1. Chồng phương thức (3) om ◼ Ví dụ 2: .c class MyDate { ng int year, month, day; co public boolean setMonth(int m) { …} an public boolean setMonth(String s) { …} } th ng public class Test{ o public static void main(String args[]){ du MyDate d = new MyDate(); u d.setMonth(9); cu d.setMonth(”September”); } } 7 CuuDuongThanCong.com https://fb.com/tailieudientucntt
  8. Một số chú ý với chồng phương thức om ◼ Các phương thức chỉ được xem xét là chồng .c khi chúng thuộc cùng một lớp ng Chỉ nên sử dụng kỹ thuật này với các phương co ◼ thức có cùng mục đích, chức năng; tránh lạm an th dụng ng Khi dịch, trình dịch căn cứ vào số lượng hoặc o ◼ du kiểu dữ liệu của tham số để quyết định gọi u cu phương thức nào phù hợp. → Nếu không chọn được hoặc chọn được nhiều hơn 1 phương thức thì sẽ báo lỗi. 8 CuuDuongThanCong.com https://fb.com/tailieudientucntt
  9. Thảo luận om ◼ Cho phương thức sau đây: .c public double test(String a, int b) Hãy chọn ra các phương thức chồng cho phương thức trên: ng ◼ co 1. void test(String b, int a) an 2. public double test(String a) th 3. private int test(int b, String a) ng 4. private int test(String a, int b) o du 5. double test(double a, int b) double test(int b) u 6. cu 7. public double test(String a, long b) 9 CuuDuongThanCong.com https://fb.com/tailieudientucntt
  10. Thảo luận om void prt(String s) { System.out.println(s); } void f1(char x) { prt("f1(char)"); } .c void f1(byte x) { prt("f1(byte)"); } ng void f1(short x) { prt("f1(short)"); } co void f1(int x) { prt("f1(int)"); } an th void f1(long x) { prt("f1(long)"); } ng void f1(float x) { prt("f1(float)"); } o void f1(double x) { prt("f1(double)"); } du Điều gì xảy ra nếu thực hiện: u ◼ 5 → int cu ◼ f1(5); ◼ char x=‘a’; f1(x); ◼ byte y=0; f1(y); 10 ◼ float z = 0; f1(z);… CuuDuongThanCong.com https://fb.com/tailieudientucntt
  11. Thảo luận om void prt(String s) { System.out.println(s); } void f2(short x) { prt("f3(short)"); } .c void f2(int x) { prt("f3(int)"); } ng void f2(long x) { prt("f5(long)"); } co void f2(float x) { prt("f5(float)"); } an th ◼ Điều gì xảy ra nếu thực hiện: ng ◼ f2(5); o du ◼ char x=‘a’; f2(x); u ◼ byte y=0; f2(y); cu ◼ float z = 0; f2(z); ◼ Điều gì xảy ra nếu gọi f2(5.5)? Error: cannot find symbol: method f2(double) 11 CuuDuongThanCong.com https://fb.com/tailieudientucntt
  12. Thảo luận Dự đoán kết quả của đoạn chương trình sau: om ◼ public class Test { .c private void myFunction(int a, long b) { ng System.out.println("int long"); co } an private void myFunction(long a, int b) { th ng System.out.println("long int"); o } du public static void main(String[] args) { u cu Test t = new Test(); t.myFunction(3, 8); } } 12 CuuDuongThanCong.com https://fb.com/tailieudientucntt
  13. 1.2. Chồng phương thức khởi tạo om ◼ Trong nhiều tình huống khác nhau cần khởi .c tạo đối tượng theo nhiều cách khác nhau ng → Cần xây dựng các phương thức khởi tạo co ◼ khác nhau cho đối tượng theo nguyên lý an th chồng phương thức (constructor ng overloading). o du u cu 13 CuuDuongThanCong.com https://fb.com/tailieudientucntt
  14. Ví dụ om public class BankAccount{ private String owner; .c private double balance; ng public BankAccount(){owner = “noname”;} co public BankAccount(String o, double b){ an owner = o; balance = b; th } ng } o du public class Test{ public static void main(String args[]){ u cu BankAccount acc1 = new BankAccount(); BankAccount acc2 = new BankAccount(“Thuy”, 100); } } 14 CuuDuongThanCong.com https://fb.com/tailieudientucntt
  15. Thảo luận Dự đoán kết quả của đoạn chương trình sau: om ◼ public class Test { .c private Test(Object o) { ng co System.out.println("Object"); an } th private Test(double[] d) { ng System.out.println("Double array"); o du } u public static void main(String[] args) { cu new Test(null); } } 15 CuuDuongThanCong.com https://fb.com/tailieudientucntt
  16. Thảo luận: nạp chồng phương thức main()? Hoàn toàn có thể nạp chồng phương thức main! om ◼ JVM luôn luôn tìm và gọi "the original main method" khi thực .c ◼ thi chương trình ng co public class Helloworld { public static void main(String[] args) { an System.out.println("main(String[] args) method"); th } ng public static void main(Integer[] args){ o du System.out.println("main(Integer[] args) method"); } u cu public static void main(Double[] args){ System.out.println("main(Double[] args) method"); } } 16 CuuDuongThanCong.com https://fb.com/tailieudientucntt
  17. Thảo luận: nạp chồng phương thức main()? Kết quả khi biên dịch và thực thi chương trình sau? om ◼ public class Test { .c public static void main(String[] args) { ng System.out.println("Hi Man (from main)"); co Test.main("Man"); } an th public static void main(String arg1) { ng System.out.println("Hi, " + arg1); o Test.main("Dear Man", "My Man"); du } u cu public static void main(String arg1, String arg2) { System.out.println("Hi, " + arg1 + ", " + arg2); } } 17 CuuDuongThanCong.com https://fb.com/tailieudientucntt
  18. 1.3. Từ khóa this om ◼ Nhắc lại: Tự tham chiếu đến đối tượng hiện tại, sử dụng bên trong lớp tương ứng với đối tượng muốn tham chiếu. .c Sử dụng thuộc tính hoặc phương thức của đối tượng thông ng ◼ qua toán tử “.”, ví dụ: co an public class BankAccount{ th private String owner; ng public void setOwner(String owner){ o this.owner = owner; du } u public BankAccount() { this.setOwner(“noname”); } cu … } ◼ Gọi đến phương thức khởi tạo khác của lớp: ◼ this(danh_sach_tham_so); //neu co tham so CuuDuongThanCong.com https://fb.com/tailieudientucntt 18
  19. Ví dụ public class Ship { om private double x=0.0, y=0.0 private double speed=1.0, direction=0.0; .c public String name; ng co public Ship(String name) { this.name = name; an } th public Ship(String name, double x, double y) { ng this(name); this.x = x; this.y = y; o } du public Ship(String name, double x, double y, u double speed, double direction) { cu this(name, x, y); this.speed = speed; this.direction = direction; } //continue… 19 CuuDuongThanCong.com https://fb.com/tailieudientucntt
  20. //(cont.) private double degreeToRadian(double degrees) { return(degrees * Math.PI / 180.0); om } .c public void move() { ng move(1); co } public void move(int steps) { an th double angle = degreesToRadians(direction); x = x + (double)steps*speed*Math.cos(angle); ng y = y + (double)steps*speed*Math.sin(angle); o du } u public void printLocation() { cu System.out.println(name + " is at (" + x + "," + y + ")."); } } //end of Ship class 20 CuuDuongThanCong.com https://fb.com/tailieudientucntt
nguon tai.lieu . vn