Đã 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 |
Chia sẻ: Mr Hưng | Lượt xem: 906 | 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