Ví dụ minh họa về interface ví dụ 1

Minh họa tính đa hình (polymorphism) trong phân cấp kế thừa thông qua việc mô tả và xử lý một số thao tác cơ bản trên các đối tượng hình học cho các bạn mới học java

// Định nghĩa lớp trừu tượng cơ sở tên Shape trong tập tin Shape.java
public abstract class Shape extends Object
{
// trả về diện tích của một đối tượng hình học shape
public double area()
{
return 0.0;
}
// trả về thể tích của một đối tượng hình học shape
public double volume()
{
return 0.0;
}
// Phương thức trừu tượng cần phải được hiện thực trong những lớp con để trả về tên đối tượng hình học shape thích hợp
public abstract String getName();
} // end class Shape
// Định nghĩa lớp Point trong tập tin Point.java
public class Point extends Shape
{
protected int x, y; // Tọa độ x, y của 1 điểm
// constructor không tham số.
public Point()
{
setPoint( 0, 0 );
}
// constructor có tham số.
public Point(int xCoordinate, int yCoordinate)
{
setPoint( xCoordinate, yCoordinate );
}
// gán tọa độ x, y cho 1 điểm
public void setPoint( int xCoordinate, int yCoordinate )
{
x = xCoordinate;
y = yCoordinate;
}
// lấy tọa độ x của 1 điểm
public int getX()
{
return x;
}
// lấy tọa độ y của 1 điểm
public int getY()
{
return y;
}
// Thể hiện tọa độ của 1 điểm dưới dạng chuỗi
public String toString()
{
return "[" + x + ", " + y + "]";
}
// trả về tên của đối tượng shape
public String getName()
{
return "Point";
}
}
// end class Point
Định nghĩa một lớp cha Shape là một lớp trừu tượng dẫn xuất từ Object và có 3 phương thức khai báo dùng tiền tố public. Phương thức getName() khai báo trừu tượng vì vậy nó phải được hiện thực trong các lớp con. Phương thức area() (tính diện tích) và phương thức volume() (tính thể tích) được định nghĩa và trả về 0.0. Những phương thức này sẽ được khai báo chồng trong các lớp con để thực hiện chức năng tính diện tích cũng như thể tích phù hợp với những đối tượng hình học tương ứng (đường tròn, hình trụ, …)
Lớp Point: dẫn xuất từ lớp Shape. Một điểm thì có diện tích và thể tích là 0.0, vì vậy những phương thức area() và volume() của lớp cha không cần khai báo chồng trong lớp Point, chúng được thừa kế như đã định nghĩa trong lớp trừu tượng Shape. Những phương thức khác như setPoint(…) để gán tọa độ x, y cho một điểm, còn phương thức getX(), getY() trả về tọa độ x, y của một điểm. Phương thức getName() là hiện thực cho phương thức trừu tượng trong lớp cha, nếu như phương thức getName() mà không được định nghĩa thì lớp Point là một lớp trừu tượng.
// Định nghĩa lớp Circle trong tập tin Circle.java
public class Circle extends Point
{
// Dẫn xuất từ lớpPoint
protected double radius;
// constructor không tham số
public Circle()
{
// ngầm gọi đến constructor của lớp cha
setRadius( 0 );
}
// constructor có tham số
public Circle( double circleRadius, int xCoordinate,
int yCoordinate )
{
// gọi constructorcủa lớp cha
super( xCoordinate, yCoordinate );
setRadius( circleRadius );
}
// Gán bán kính của đường tròn
public void setRadius( double circleRadius )
{
radius = ( circleRadius >= 0 ? circleRadius:0 );
}
// Lấy bán kính của đường tròn
public double getRadius()
{
return radius;
}
// Tính diện tích đường tròn Circle
public double area()
{
return Math.PI * radius * radius;
}
// Biểu diễn đường tròn bằng một chuỗi
public String toString()
{
return "Center = " + super.toString() +
"; Radius = " + radius;
}
// trả về tên của shape
public String getName()
{
return "Circle";
}
} // end class Circle
 Lớp Circle dẫn xuất từ lớp Point, một đường tròn có thể tích là 0.0, vì vậy phương thức volume() của lớp cha không khai báo chồng, nó sẽ thừa kế từ lớp Point, mà lớp Point thì thừa kế từ lớp Shape. Diện tích đường tròn khác với một điểm, vì vậy phương thức tính diện tích area() được khai báo chồng.
Phương thức getName() hiện thực phương thức trừu tượng đã khai báo trong lớp cha, nếu phương thức getName() không khai báo trong lớp Circle thì nó sẽ kế thừa từ lớp Point.Phương
thức setHeight dùng để gán chiều cao mới cho một đối tượng hình trụ, còn phương thức getHeight trả về chiều cao của một đối tượng hình trụ.
// Test.java
// Kiểm tra tính kế thừa của Point, Circle, Cylinder với lớp trừu tượng Shape.
// Khai báo thư viện
import java.text.DecimalFormat;
public class Test
{
// Kiểm tra tính kế thừa của các đối tượng hình học
public static void main( String args[] )
{
 // Tạo ra các đối tượng hìnhhọc
Point point = new Point( 7, 11 );
Circle circle = new Circle( 3.5, 22, 8 );
Cylinder cylinder = new Cylinder( 10, 3.3, 10, 10 );
// Tạo một mảng các đối tượng hình học
Shape arrayOfShapes[] = new Shape[ 3 ];
// arrayOfShapes[ 0 ] là một đối tượng Point
arrayOfShapes[ 0 ] = point;
// arrayOfShapes[ 1 ] là một đối tượng Circle
arrayOfShapes[ 1 ] = circle;
// arrayOfShapes[ 2 ] là một đối tượng cylinder
arrayOfShapes[ 2 ] = cylinder;
// Lấy tên và biểu diễn của mỗi đối tượng hình học
73
String output =
point.getName() + ": " + point.toString() + "\n" +
circle.getName() + ": " + circle.toString() + "\n" +
cylinder.getName() + ": " + cylinder.toString();
DecimalFormat precision2 = new DecimalFormat(
"0.00" );
// duyệt mảng arrayOfShapes lấy tên, diện tích, thể tích
// của mỗi đối tượng hình học trong mảng.
for ( int i = 0; i < arrayOfShapes.length; i++ )
{
output += "\n\n" + arrayOfShapes[ i ].getName() +
": " + arrayOfShapes[ i].toString() +
"\n Area = " +
precision2.format( arrayOfShapes[ i ].area() ) +
"\nVolume = " +
precision2.format( arrayOfShapes[ i ].volume() );
}
System.out.println(output);
System.exit( 0 );
}
} // end class Test
Kết quả thực thi chương trình:

0 nhận xét: