Đã học: 
§  biến (variables), biểu diễn dữliệu (phân biệt bởi kiểu)
§  phương thức (tĩnh), biểu diễn hành vi 
v  đối tượng:biến chứa dữliệu và hành vi. 
§  Biểu diễn dữliệu của đối tượng. 
§  Biểu diễn hành vi của đối tượng. 
v  Lớp: 
§  Khối cơbản của một chương trình JAVA 
Và 
§  Kiểu dữliệu cho đối tượng 
              
                                            
                                
            
 
            
                 84 trang
84 trang | 
Chia sẻ: Mr Hưng | Lượt xem: 1194 | Lượt tải: 0 
              
            Bạn đang xem trước 20 trang nội dung tài liệu Lập trình hướng đối tượng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
+= 6; 
p1.z + 2; 
p2.x += 2; 
p2.y += 4; 
p2.z += -2; 
p3.x += 1; 
p3.y += 7; 
p3.z += 17; 
65 
Tránh rườm rà 
v Phương thức tĩnh. 
// Shifts the location of the given point. 
public static void translate( 
 Point p, int dx, int dy, int dz) { 
 p.x += dx; 
 p.y += dy; 
 p.z += dz; 
} 
v Example: 
// move p2 
translate(p2, 2, 4, 6); 
v Question: Tại sao không trả về point vừa sửa? 
66 
Phương thức tĩnh có tốt ? 
v Client code: cần phải viết riêng phương thức tĩnh! 
v Cú pháp không phù hớp với khi tương tác với đối 
tượng : 
 translate(p2, 2, 4); 
 We want : 
 p2.translate(2, 4); 
67 
Lớp có hành vi 
v Viết lớp: trộn lẫn trạng thái và hành vi. 
v Dịch chuyển Point liên quan đến dữ liệu x/y/z của 
đối tượng Point3D -> thuộc về lớp Point3D. 
68 
Phương thức của thực thể 
v instance method: Phương thức bên trong đối 
tượng, thao tác trên chính đối tượng này. 
v Cú pháp khai báo: 
 public () { 
 ; 
 } 
v How does this differ from previous methods? 
69 
Phương thức thực thể 
v Một phương thức thực thể của đối tượng có thể 
tham chiếu tới các trường của đối tượng đó. 
public void translate(int dx, int dy, int dz) { 
 x += dx; 
 y += dy; 
 z += dz; 
} 
v How does the translate method know which x, 
y, z to modify? 
70 
Tham số ngầm định 
v Mỗi lần gọi phương thức thực thể đều tương ứng 
với một đối tượng cụ thể. 
§  Example: p1.translate(11, 6, 2); 
v Code cho các phương thức này sẽ hiểu ngầm đối 
tượng nào. 
v Tham số ngầm định (implicit parameter): Đối 
tượng có phương thức thực thể được gọi. 
71 
Point3D object diagrams 
v  Mỗi đối tượng có một phương thức translate riêng : 
Point3D p1 = new Point3D(7, 2, -2); 
Point3D p2 = new Point3D(4, 3, 2); 
p1: 
p2: 
public void translate(int dx, int dy, int dz)
{ 
 ... 
} 
 y: x: 7 2 z: -2 
public void translate(int dx, int dy, int dz)
{ 
 ... 
} 
 y: x: 4 3 z: 2 
18 
72 
Tracing 
v What happens? 
p1.translate(11, 6, 3); 
p2.translate(1, 7, -10); 
p1: 
p2: 
public void translate(int dx, int dy, int dz)
{ 
 ... 
} 
 y: x: 7 2 z: -2 
public void translate(int dx, int dy, int dz)
{ 
 ... 
} 
 y: x: 4 3 z: 2 
8 1 
5 10 -8 
Point3D : Version 3 
public class Point3D { 
 public int x; 
 public int y; 
 public Point3D( 
 int initialX, int initialY, int initialZ) { 
 x = initialX; 
 y = initialY; 
 z = initialZ; 
 } 
 // Changes the location of this Point3D object. 
 public void translate(int dx, int dy, int dz){ 
 x += dx; 
 y += dy; 
 z += dz; 
 } 
} 
73 
74 
Client program: Version 3 
public class PointMain3 { 
 public static void main(String[] args) { 
 // create two Point3D objects 
 Point3D p1 = new Point3D(5, 2, -2); 
 Point3D p2 = new Point3D(4, 3, 2); 
 // print each point 
 System.out.println("p1 is (" + p1.x + ", " + p1.y + ")"); 
 System.out.println("p2 is (" + p2.x + ", " + p2.y + ")"); 
 // move p2 and then print it again 
 p2.translate(2, 4, -2); 
 System.out.println("p2 is (" + p2.x + ", " + p2.y + ")"); 
 } 
} 
Output: 
p1 is (5, 2, -2) 
p2 is (4, 3, 2) 
p2 is (6, 7, 0) 
75 
Exercises 
v  Viết phương thức thực thể tên distanceFromOrigin tính và 
trả về khoảng cách giữa đối tượng hiện tại và vị trí (0, 0, 0). 
v  Viết một phương thức thực thể tên distance nhận tham số vào 
là một đối tượng Point3D và tính khoảng cách giữa đối tương 
này với đối tượng hiện tại. 
v  Viết một phương thức thực thể tên setLocation nhận 3 tham 
số x, y, và z và thay đổi vị trí của đối tượng hiện tại theo 3 vị trí 
mới này. 
v  Sửa client code để sử dụng phương thức mới. 
76 
Solutions 
public class Point3D { 
 public int x; 
 public int y; 
 public int z; 
 // Changes the location of this Point3D object. 
 public void translate(int dx, int dy, int dz) { 
 setLocation(x + dx, y + dy, z + dz); 
 } 
 // Returns the distance from this Point object to the origin 
 public double distanceFromOrigin() { 
 return Math.sqrt(x * x + y * y + z * z); 
 } 
 // Returns the distance from this Point3D object to the given point 
 public double distance(Point3D other) { 
 int dx = x - other.x; 
 int dy = y - other.y; 
 int dz = z – other.z; 
 return Math.sqrt(dx * dx + dy * dy + dz * dz); 
 } 
 // Sets this Point3D object's location 
 public void setLocation(int newX, int newY, int newZ) { 
 x = newX; 
 y = newY; 
 z = newZ; 
 } 
} 
Exercise 
v Recall the client program from the previous exercise 
that produced this output: 
 p1 is (7, 2, -5) 
 p1's distance from origin = 8.831760866327846 
 p2 is (4, 3, 2) 
 p2's distance from origin = 5.385164807134504 
 p1 is (18, 8, -2) 
 p2 is (5, 10, 20) 
v Modify the program to use our new instance 
methods. 
v Also add the following output to the program: 
 distance from p1 to p2 = 13.152946437965905 77 
78 
Solution 
public class PointProgram { 
 public static void main(String[] args) { 
 // create two Point objects 
 Point p1 = new Point(); 
 p1.setLocation(7, 2); 
 Point p2 = new Point(); 
 p2.setLocation(4, 3); 
 // print each point 
 System.out.println("p1 is (" + p1.x + ", " + p1.y + ")"); 
 System.out.println("p1's distance from origin = " + p1.distanceFromOrigin()); 
 System.out.println("p2 is (" + p2.x + ", " + p2.y + ")"); 
 System.out.println("p2's distance from origin = " + p2.distanceFromOrigin()); 
 // move points and then print again 
 p1.translate(11, 6); 
 System.out.println("p1 is (" + p1.x + ", " + p1.y + ")"); 
 p2.translate(1, 7); 
 System.out.println("p2 is (" + p2.x + ", " + p2.y + ")"); 
 System.out.println("distance from p1 to p2 = " + p1.distance(p2)); 
 } 
} 
Solution 
public class PointProgram { 
 public static void main(String[] args) { 
 // create two Point3D objects 
 Point3D p1 = new Point3D(7, 2, -5); 
 Point3D p2 = new Point3D(4, 3, 2); 
 // print each point 
 System.out.println("p1 is (" + p1.x + ", " + p1.y + “, “ + p1.z + ")"); 
 System.out.println(“p1’s distance from origin = “ + p1.distanceFromOrigin()); 
 System.out.println("p2 is (" + p2.x + ", " + p2.y + “, “ + p2.z + ")"); 
 System.out.println("p2's distance from origin = " + p2.distanceFromOrigin()); 
 // move points and then print again 
 p1.translate(11, 6, 3); 
 System.out.println("p1 is (" + p1.x + ", " + p1.y + “, “ + p1.z + ")"); 
 p2.translate(1, 7, 22); 
 System.out.println("p2 is (" + p2.x + ", " + p2.y + “, “ + p2.z + ")"); 
 System.out.println("distance from p1 to p2 = " + p1.distance(p2)); 
 } 
} 
79 
80 
toString or not toString 
81 
Latest version of client code 
public class PointMain3 { 
 public static void main(String[] args) { 
 // create two Point objects 
 Point p1 = new Point(7, 2, -5); 
 Point p2 = new Point(4, 3, 2); 
 // print each point 
 System.out.println("p1 is (" + p1.x + ", " + p1.y + ")"); 
 System.out.println("p2 is (" + p2.x + ", " + p2.y + ")"); 
 // move p2 and then print it again 
 p2.translate(2, 4, -2); 
 System.out.println("p2 is (" + p2.x + ", " + p2.y + ")"); 
 } 
} 
v Any remaining redundancies? 
82 
Printing points 
v Instead of 
 System.out.println("p1 is (" + p1.x + ", " + p1.y + ")"); 
v It would be nice to have something more like: 
 System.out.println("p1 is " + p1); 
v What does this line currently do? Does it even 
compile? 
 It will print: p1 is Point@9e8c34 
83 
toString 
v When an object is printed or concatenated with a 
String, Java calls the object's toString method. 
System.out.println("p1 is " + p1); 
is equivalent to: 
System.out.println("p1 is " + p1.toString()); 
v Note: Every class has a toString method. 
84 
toString 
v The default toString behavior is to return the 
class's name followed by gibberish (as far as you 
are concerned). 
v You can replace the default behavior by defining a 
toString method in your class. 
85 
toString method syntax 
v The toString method, general syntax: 
 public String toString() { 
 ; 
 } 
v NB: The method must have this exact name and 
signature (i.e., public String toString()). 
v Example: 
 // Returns a String representing this Point. 
 public String toString() { 
 return "(" + x + ", " + y + “, “ + z + ")"; 
 } 
            Các file đính kèm theo tài liệu này:
 01_object_2249.pdf 01_object_2249.pdf