Phần này đưa ra hai ví dụ về định nghĩa lớp và sử dụng chúng để tạo các đối tượng. Một chương trình định nghĩa lớp Circle và sử dụng nó để tạo các đối tượng. Chương trình tạo ra 3 đối tượng hình tròn với bán kính 1, 25, và 125 và hiển thị bán kính và diện tích của mỗi hình tròn. Sau đó thay đổi bán kính của đối tượng thứ hai thành 100 và hiển thị bán kính và diện tích mới.
Lớp Circle trong ví dụ này được đặt tên là SimpleCircle. Dưới đây là lớp TestSimpleCircle chứa đoạn mã lệnh sử dụng lớp SimpleCircle.
public class TestSimpleCircle { /** * Main method */ public static void main(String[] args) { SimpleCircle circle1 = new SimpleCircle(); System.out.println("The area of the circle of radius " + circle1.radius + " is " + circle1.getArea()); SimpleCircle circle2 = new SimpleCircle(25); System.out.println("The area of the circle of radius " + circle2.radius + " is " + circle2.getArea()); SimpleCircle circle3 = new SimpleCircle(125); System.out.println("The area of the circle of radius " + circle3.radius + " is " + circle3.getArea()); circle2.radius = 100; System.out.println("The area of the circle of radius " +circle2.radius + " is " + circle2.getArea()); }}
Lớp SimpleCircle.
class SimpleCircle { double radius; /* Construct a circle with radius */ SimpleCircle() { radius = 1; } /* Construct a circle with a specified radius */ SimpleCircle(double newRadius) { radius = newRadius; } /* Return the area of this circle */ double getArea() { return radius * radius * Math.PI; } /* return the perimeter of this circle */ double getPerimeter() { return 2 * radius * Math.PI; } /* set a new radius for this circle */ void setRadius(double newRadius) { radius = newRadius; }}
Chương trình bao gồm hai lớp. Lớp đầu tiên là TestSimpleCircle, đây là lớp chính. Mục đích duy nhất của nó là để kiểm tra lớp thứ hai, SimpleCircle. Một chương trình sử dụng lớp như vậy thường được gọi là client của lớp. Khi bạn chạy chương trình, hệ thống Java runtime sẽ gọi phương thức main trong lớp chính.
Bạn có thể đặt hai lớp vào một file, nhưng chỉ một lớp trong file xác định là lớp public (điều này sẽ được giải thích rõ hơn khi tìm hiểu về quyền truy cập lớp và các thành phần). Hơn nữa, lớp public phải có cùng tên với tên file. Do đó, tên file là TestSimpleCircle.java, vì TestSimpleCircle là lớp public. Mỗi lớp trong mã nguồn được biên dịch thành một file .class. Khi bạn biên dịch TestSimpleCircle.java, hai file lớp TestSimpleCircle.class và SimpleCircle.class được tạo ra, như thể hiện trong hình sau đây:
Lớp chính chứa phương thức main để tạo 3 đối tượng. Như trong việc tạo ra một mảng, toán tử new được sử dụng để tạo ra một đối tượng từ constructor: new SimpleCircle() tạo một đối tượng với bán kính 1, new SimpleCircle(25) tạo ra một đối tượng có bán kính 25, và new SimpleCircle(125) tạo một đối tượng với bán kính 125.
Ba đối tượng này (tham chiếu bởi circle1, circle2, và circle3) có dữ liệu khác nhau nhưng có cùng phương thức. Do đó, bạn có thể tính toán diện tích bằng cách sử dụng phương thức getArea(). Các trường dữ liệu có thể được truy cập thông qua tham chiếu của đối tượng bằng cách sử dụng circle1.radius, circle2.radius, và circle3.radius. Đối tượng có thể gọi phương thức của nó qua tham chiếu của đối tượng bằng cách sử dụng circle1.getArea(), circle2.getArea(), và circle3.getArea().
Ba đối tượng này hoạt động một cách độc lập. Bán kính của circle2 được thay đổi thành 100.
Có rất nhiều cách để viết các chương trình Java. Ví dụ, bạn có thể kết hợp hai lớp trong ví dụ thành một, như sau:
File SimpleCircle.java:
public class SimpleCircle { public static void main(String[] args) { SimpleCircle circle1 = new SimpleCircle(); System.out.println("The area of the circle of radius " + circle1.radius + " is " + circle1.getArea()); SimpleCircle circle2 = new SimpleCircle(25); System.out.println("The area of the circle of radius " + circle2.radius + " is " + circle2.getArea()); SimpleCircle circle3 = new SimpleCircle(125); System.out.println("The area of the circle of radius " + circle3.radius + " is " + circle3.getArea()); circle2.radius = 100; System.out.println("The area of the circle of radius " + circle2.radius + " is " + circle2.getArea()); } double radius; SimpleCircle() { radius = 1; } SimpleCircle(double newRadius) { radius = newRadius; } double getArea() { return radius * radius * Math.PI; } double getPerimeter() { return 2 * radius * Math.PI; } void setRadius(double newRadius) { radius = newRadius; } }
Lớp kết hợp có phương thức main, do đó nó có thể thực thi bởi trình thông dịch Java. Điều này chứng tỏ rằng bạn có thể kiểm tra một lớp bằng cách thêm một phương thức main trong cùng lớp.
Một ví dụ khác, quan sát tập các kênh truyền hình. Mỗi TV là một đối tượng với các trạng thái (kênh hiện tại, mức âm lượng hiện tại, bật hoặc tắt nguồn) và hành vi (thay đổi kênh, điều chỉnh âm lượng, bật / tắt). Bạn có thể sử dụng một lớp để mô hình hoá lại đối tượng TV. Biểu đồ UML cho lớp được hiển thị như sau:
Chương trình định nghĩa lớp TV:
public class TV { int channel = 1; int volumeLevel = 1; boolean on = false; public TV() { } public void turnOn() { on = true; } public void turnOff() { on = false; } public void setChannel(int newChannel) { if (on && newChannel >= 1 && newChannel <= 120) channel = newChannel; } public void setVolume(int newVolumeLevel) { if (on && newVolumeLevel >= 1 && newVolumeLevel <= 7) volumeLevel = newVolumeLevel; } public void channelUp() { if (on && channel < 120) channel++; } public void channelDown() { if (on && channel > 1) channel--; } public void volumeUp() { if (on && volumeLevel < 7) volumeLevel++; } public void volumeDown() { if (on && volumeLevel > 1) volumeLevel--; }}
Constructor và các phương thức trong lớp TV được định nghĩa là public để chúng có thể được truy cập từ các lớp khác. Lưu ý rằng kệnh và mức âm lượng không thay đổi nếu TV không bật. Trước khi kênh và mức âm được được thay đổi, giá trị hiện tại của nó được kiểm tra để đảm bảo rằng nó nằm trong dải đúng.
Chương trình sử dụng lớp TV bằng cách tạo ra 2 đối tượng
Chương trình tạo 2 đối tượng, và gọi các phương thức trên các đối tượng để thực hiện các hành động để cài đặt các kênh và mức âm lượng và để tăng kênh và âm lượng. Các phương thức được gọi bằng cách sử dụng cú pháp như tv1.turnOn(). Các trường dữ liệu được truy cập bằng cách sử dụng cú pháp như tv1.channel.
Những ví dụ này đã cung cấp cho bạn một cái nhìn thoáng qua về lớp và đối tượng.