Lập trình hướng đối tượng với Java (Bài 2)
Lập trình hướng đối tượng trong Java là một trong những bài quan trong trong khóa học Lập trình Java cơn bản.
Thông qua bài học này, chúng tôi sẽ trình bày 4 tính chất của lập trình hướng đối tượng thông qua những ví dụ cụ thể.
Lập trình hướng đối tượng trong Java – Giới thiệu
Cho thông tin về danh sách khách hàng (Customer) như hình
Với mỗi khách hàng (Customer), các yêu cầu về dữ liệu cần được quản lý gồm Customer ID, Name, Address và Age.
Lập trình hướng đối tượng trong Java – Thảo luận về cách để tạo ra các khách hàng
public class Customer {
int customerID;
String customerName;
String customerAddress;
int customerAge;
public static void main(String[] args) {
Customer c = new Customer();
c.customerID = 100;
c.customerName = "Jack";
c.customerAddress = "123 Street";
c.customerAge = 30;
System.out.println("Ma: " + c.customerID);
System.out.println("Ten: " + c.customerName);
System.out.println("Dia chi: " + c.customerAddress);
System.out.println("Tuoi: " + c.customerAge);
}
}
Giải thích
- Khai báo thuộc tính của đối tượng khách hàng
int customerID;
String customerName;
String customerAddress;
int customerAge;
- Tạo một đối tượng khách hàng
Customer c = new Customer();
- Truy cập đến các thuộc tính để lưu trữ thông tin của đối tượng
c.customerID = 100;
c.customerName = "John";
c.customerAddress = "123 Street";
c.customerAge = 30;
- Hiển thị thông tin chi tiết đối tượng khách hàng
System.out.println("Ma: " + c.customerID);
System.out.println("Ten: " + c.customerName);
System.out.println("Dia chi: " + c.customerAddress);
System.out.println("Tuoi: " + c.customerAge);
Lập trình hướng đối tượng trong Java – Thảo luận về các hành vi của đối tượng
Giải thích
- Hành vi changeCustomerAddress() được sử dụng để thay đổi địa chỉ của khách hàng
void changeCustomerAddress(String address) {
customerAddress = address;
}
- Hành vi displayCustomerInformation() được sử dụng để thiển thị thông tin khách hàng
void displayCustomerInformation() {
System.out.println("Ma: " + customerID);
System.out.println("Ten: " + customerName);
System.out.println("Dia chi: " + customerAddress);
System.out.println("Tuoi: " + customerAge);
}
Lập trình hướng đối tượng trong Java – Kết luận
Lớp (class) là khuôn mẫu để tạo ra đối tượng. Các thành viên của lớp bao gồm thuộc tính (dữ liệu) và phương thức (hành vi)
Khai báo class
public <class_name> {
class body
}
Khai báo thuộc tính
[access_modifier] data_type propertyName;
access_modifier gọi là phạm vi truy cập. Nó có thể là private, protected và public
private | Chỉ được phép truy cập tại lớp khai báo |
protected | Được phép truy cập tại lớp khai báo, lớp con cùng gói hoặc khác gói và những lớp cùng gói (package) |
public | Được truy cập ở tất cả các lớp, ở tất cả các gói trong cùng project |
default | Được truy cập ở những lớp con cùng gói hoặc những lớp khác cùng gói |
instanceVariableName chỉ định tên của thuộc tính
Khai báo phương thức
[access_modifier] <return type> <method_name> ([list of parameters]) {
Body of the method
}
Trong đó:
- access_modifier tương tự khai báo thuộc tính
- returntype chỉ định kiểu dữ liệu trả về như int, long, float, double, String, boolean, object
- method_name là tên phương thức
- list of parameters là các giá trị được truyền cho phương thức
Ví dụ tạo phương thức nhập thông tin khách hàng với phạm vi truy cập là private
private void inputCustomerInformation() {
Scanner s = new Scanner(System.in);
System.out.println("Nhap ma khac hang");
customerID = s.nextInt();
//Clear
s.nextLine();
System.out.println("Nhap ten khach hang");
customerName = s.nextLine();
System.out.println("Nhap dia chi");
customerAddress = s.nextLine();
System.out.println("Nhap tuoi");
customerAge = s.nextInt();
}
Tạo đối tượng
<class_name> <object_name> = new <class_name>();
Trong đó:
- class_name là tên lớp
- object_name là tên đối tượng
Ví dụ tạo đối tượng khách hàng
Customer c = new Customer();
Truy cập thuộc tính và phương thức
//Truy cập thuộc tính
object_name.propertyName;
//Truy cập phương thức object_name.methodName;
Ví dụ truy cập thuộc tính và phương thức của đối tượng tên c
/Truy cập thuộc tính customerID
System.out.println(c.customerID);
//Truy cập phương thức nhập thông tin
c.inputCustomerInformation();
//Truy cập phương thức hiển thị thông tin
c.displayCustomerInformation();
Tạo lớp (class) trong Netbeans IDE
Chuột phải project -> chọn New -> chọn Java Class
Nhập tên lớp tại Class Name -> chọn Finish
Kết quả khi tạo thành công một class trong Netbeans IDE
Lập trình hướng đối tượng trong Java – Bài thực hành số 1
Xây dựng lớp để tạo đối tượng sinh viên trong một lớp học. Biết rằng mỗi sinh viên cần quản lý các thông tin như mã số sinh viên, tên sinh viên, nơi sinh, ngày tháng năm sinh, giới tính, số điện thoại, email và mã lớp.
Xây dựng ứng dụng cho phép nhập và hiển thị thông tin của sinh viên với yêu cầu cụ thể như sau:
Ứng dụng hiển thị danh sách chức năng cho phép người dùng lựa chọn:
- add/ADD – Input
- disp/DISP – Display
- exit/EXIT – Eixt application
Khi người dùng nhập “add/ADD”:
- Nhập thông tin cho sinh viên.
- Các thông tin như tên sinh viên, giới tính, ngày tháng năm sinh và số điện thoại bắt buộc phải nhập. Các thông tin khác có thể bỏ qua.
- Mã sinh viên được phát sinh tự động.
- Giới tính chỉ được phép nhập nam/Nam hoặc nữ/Nữ.
- Ngày tháng năm sinh phải đủ 10 ký tự.
Khi người dùng nhập “disp/DISP”:
- Hiển thị thông tin sinh viên.
- Chức năng này chỉ được thực hiện sau khi đã thực hiện chức năng “add/ADD”
Lập trình hướng đối tượng trong Java – Bài thực hành số 2
Xây dựng lớp để tạo danh sách nhân viên trong một công ty. Biết rằng mỗi nhân viên cần quản lý các thông tin như tên nhân viên, nơi sinh, ngày tháng năm sinh, giới tính, trình độ chuyên môn, số điện thoại, email.
Trong lớp này sẽ có hai phương thức để thực hiện nhập thông tin cho nhân viên và hiển thị thông tin của nhân viên.
Sử dụng lớp đã tạo ở trên để nhập thông tin cho 3 nhân viên trong công ty; cho phép tìm kiếm thông tin nhân viên theo tên, …
Phương thức khởi tạo
Được sử dụng để khởi tạo giá trị cho các thuộc tính, có tên trùng với tên lớp, được gọi khi tạo đối tượng.
Khai báo theo cú pháp
public ClassName(Danh sách tham số) {
Xử lý
}
Ví dụ khai báo phương thức khởi tạo cho lớp Customer
public class Customer {
//Thuộc tính
int customerID;
String customerName;
String customerAddress;
int customerAge;
//Phương thức khởi tạo (Constructor)
public Customer(int id, String name, String address, int age){
customerID = id;
customerName = name;
customerAddress = address;
customerAge = age;
}
}
Gọi phương thức khởi tạo để tạo ra một nhân viên với các thông tin được chỉ định
Customer c1 = new Customer(1, "Bùi Văn Nông", "HCM", 24);
Lập trình hướng đối tượng trong Java – Bài thực hành số 3
Xây dựng chương trình cho phép cộng, trừ, nhân và chia 2 phân số. Sử dụng phương thức khởi tạo để nhập tử số và mẫu số. Mỗi một phép tính tương ứng cho một phương thức.
Lập trình hướng đối tượng java – Tính kế thừa
Đặt vấn đề
- Xây dựng lớp để tạo đối tượng nhân viên với các thông tin như tên, địa chỉ, email, số điện thoại, bằng cấp. Phương thức nhập và hiển thị thông tin nhân viên.
- Xây dựng lớp để tạo khách hàng với các thông tin như tên, địa chỉ, email, số điện thoại, loại khách hàng. Phương thức nhập và hiển thị thông tin khách hàng.
Phân tích
- Cả hai lớp có những đặc điểm chung tên, địa chỉ, email, số điện thoại
- Cả hai lớp đều có xử lý nhập và hiển thị tên, địa chỉ, email, số điện thoại
Kết luận
- Những phần chung sẽ được khai báo ở lớp chung (lớp cha).
- Lớp nhân viên và lớp khách hàng sẽ kế thừa những phần chung ở lớp cha.
Lưu ý:
Cú pháp
- Xây dựng lớp dùng chung (lớp cha)
public class BaseClass {
//Khai báo thuộc tính chung
//Xây dựng phương thức chung
}
- Xây dựng lớp mới kế thừa lớp cha
public class ClassName extends BaseClass {
//Khai báo những thuộc tính riêng
//Xây dựng phương thức riêng
}
Ví dụ về kế thừa gồm 3 lớp Nguoi, NhanVien và KhachHang
Lớp Nguoi
package inheritance;
/**
*
* @author giasutinhoc.vn
*/
public class Nguoi {
protected String ten;
protected String diachi;
protected String email;
protected String sdt;
public Nguoi(String ten, String diachi, String email, String sdt) {
this.ten = ten;
this.diachi = diachi;
this.email = email;
this.sdt = sdt;
}
public void nhap() {
Scanner s = new Scanner(System.in);
System.out.println("Nhap ho ten:");
ten = s.nextLine();
System.out.println("Nhap dia chi:");
diachi = s.nextLine();
System.out.println("Nhap email:");
email = s.nextLine();
System.out.println("Nhap so dien thoai:");
sdt = s.nextLine();
}
public void hienthi() {
System.out.println("Ho ten:" + ten);
System.out.println("Dia chi:" + diachi);
System.out.println("Email:" + email);
System.out.println("So dien thoai:" + sdt);
}
}
Lớp NhanVien
package inheritance;
/**
*
* @author giasutinhoc.vn
*/
public class NhanVien extends Nguoi {
private String bangcap;
public NhanVien(String bangcap, String ten, String diachi, String email, String sdt) {
super(ten, diachi, email, sdt);
this.bangcap = bangcap;
}
//@Override
public void nhap() {
super.nhap();
Scanner s = new Scanner(System.in);
System.out.println("Nhap bang cap:");
bangcap = s.nextLine();
}
@Override
public void hienthi() {
super.hienthi();
System.out.println("Bang cap: " + bangcap);
}
}
Lớp KhachHang
package inheritance;
/**
*
* @author giasutinhoc.vn
*/
public class KhachHang extends Nguoi{
private String loai;
public KhachHang(String ten, String diachi, String email, String sdt, String loai) {
super(ten, diachi, email, sdt);
this.loai = loai;
}
@Override
public void nhap() {
super.nhap();
Scanner s = new Scanner(System.in);
System.out.println("Nhap loai:");
loai = s.nextLine();
}
@Override
public void hienthi() {
super.hienthi();
System.out.println("Loai: " +loai);
}
}
Overriding Methods
Trong lớp con cho phép tạo phương thức cùng tên, cùng kiểu dữ liệu, cùng số lượng tham số và kiểu dữ liệu trả về như phương thức ở lớp cha nhưng khác nhau về xử lý.
Ví dụ phương thức nhap() trong ví dụ trên được override ở lớp con
Tại lớp cha (lớp Nguoi)
public void nhap() {
Scanner s = new Scanner(System.in);
System.out.println("Nhap ho ten:");
ten = s.nextLine();
System.out.println("Nhap dia chi:");
diachi = s.nextLine();
System.out.println("Nhap email:");
email = s.nextLine();
System.out.println("Nhap so dien thoai:");
sdt = s.nextLine();
}
Tại lớp con (lớp NhanVien)
@Override
public void nhap() {
super.nhap();
Scanner s = new Scanner(System.in);
System.out.println("Nhap bang cap:");
bangcap = s.nextLine();
}
Truy cập constructor, method và attribute của lớp cha
Truy cập phương thức (method) của lớp cha
super.method-name();
Truy cập phương thức khởi tạo (constructor) của lớp cha
super(<argument list>);
Truy cập thuộc tính (attribute) của lớp cha
super.attribute-name;
Ví dụ về truy cập constructor và method
Lớp Vehicle
package inheritance.superkeyword;
/**
*
* @author giasutinhoc.vn
*/
public class Vehicle {
// Declare common attributes of a vehicle
protected String vehicleNo; // Variable to store vehicle number
protected String vehicleName; // Variable to store vehicle name
protected int wheels; // Variable to store number of wheels
public Vehicle(String vehicleNo, String vehicleName, int wheels) {
this.vehicleNo = vehicleNo;
this.vehicleName = vehicleName;
this.wheels = wheels;
}
/**
* Accelerates the vehicle
*
* @return void
*/
public void accelerate(int speed) {
System.out.println("Accelerating at: " + speed + "km");
}
}
Lớp FourWheeler
package inheritance.superkeyword;
/**
*
* @author giasutinhoc.vn
*/
public class FourWheeler extends Vehicle {
// Declare a field specific to child class
private boolean powerSteer; // Variable to store steering information
public FourWheeler(String vId, String vName, int numWheels, boolean pSteer) {
// Attributes inherited from parent class
// Invoke the super class constructor
super(vId,vName,numWheels);
// Child class’ own attribute
powerSteer = pSteer;
}
@Override
public void accelerate(int speed) {
//Calling method of super class
super.accelerate(speed);
System.out.println("Maximum Accelerating at: " + speed + "km");
}
}
Lập trình hướng đối tượng trong Java – Bài thực hành số 4
Xây dựng lớp với tên Person có các thuộc tính tên, địa chỉ, email, số điện thoại và 2 phương thức dùng để nhập và hiển thị thông tin.
Xây dựng lớp tên Employee kế thừa lớp Person có thêm thuộc tính bằng cấp
Xây dựng lớp tên Customer kế thừa lớp Person có thêm thuộc tính loại khách hàng
Lập trình hướng đối tượng java – Tính đóng gói
Đối với những thuộc tính đươc khai báo ở này nhưng sẽ không được truy cập ở lớp khác => những thuộc tính này sẽ được khai báo với phạm vi truy cập là private
Đối với những thuộc tính chỉ cho phép đọc không cho phép ghi => xây dựng phương thức getter
Đối với những thuộc tính chỉ cho phép ghi không cho phép đọc => xây dựng phương thức setter
public class Rectangle {
private int length;
private int width;
//Đọc
public int getLength() {
return length;
}
//Ghi
public void setWidth(int w) {
width = w;
}
}
Lập trình hướng đối tượng java – Tính đa hình
Trong thực tế, cùng một người cũng có thể đảm nhận nhiều vai trò khác nhau như làm cha, làm con, làm chồng, vv. Điều này có nghĩa, họ hành xử khác nhau trong các tình huống khác nhau.
Tương tự như vậy, Java cung cấp một tính năng gọi là đa hình trong đó các đối tượng hành xử khác nhau dựa trên các bối cảnh mà chúng được sử dụng.
Trường hợp 1 – Trong một lớp:
Xây dựng những phương thức trùng tên nhưng khác nhau về tham số (số lượng, kiểu dữ liệu, trình tự xuất hiện). Dựa vào ngữ cảnh lúc thực thi để quyết định phương thức nào được gọi.
Ví dụ tạo lớp Customer có 2 constructor
public class Customer {
//Thuộc tính
int customerID;
String customerName;
String customerAddress;
int customerAge;
//Phương thức khởi tạo không có tham số
public Customer(){
customerID = 0;
customerName = "";
customerAddress = "";
customerAge = 0;
}
//Phương thức khởi tạo có tham số (Constructor)
public Customer(int id, String name, String address, age){
customerID = id;
customerName = name;
customerAddress = address;
customerAge = age;
}
}
Trường hợp 2 – Trong nhiều lớp:
Đa hình thể hiện ở kỹ thuật override method.
public class Vehicle {
public void accelerate(int speed) {
System.out.println("Accelerating at: " + speed + "km");
}
}
public class FourWheeler extends Vehicle {
@Override
public void accelerate(int speed) {
//Calling method of super class
super.accelerate(speed);
System.out.println("Maximum Accelerating at: " + speed + "km");
}
}
Trường hợp khác tạo thể hiện của một lớp từ nhiều lớp khác nhau
package polymorphism;
/**
*
* @author giasutinhoc.vn
*/
public class Employee {
String empId; // Variable to store employee ID
String empName; // Variable to store employee name
int salary; // Variable to store salary
float commission; // Variable to store commission
public Employee(String id, String name, int sal) {
empId = id;
empName = name;
salary = sal;
}
public void calcCommission(int overtime) {
if (overtime > 8) {
commission = salary / 30;
} else {
commission = 0;
}
}
public void displayDetails() {
System.out.println("Employee ID:" + empId);
System.out.println("Employee Name:" + empName);
System.out.println("Salary:" + salary);
System.out.println("Commission:" + commission);
}
}
package polymorphism;
/**
*
* @author giasutinhoc.vn
*/
public class PartTimeEmployee extends Employee {
// Subclass specific variable
String shift; // Variable to store shift information
public PartTimeEmployee(String id, String name, int sal, String shift) {
// Invoke the super class constructor
super(id, name, sal);
this.shift = shift;
}
@Override
public void displayDetails() {
calcCommission(12); // Invoke the inherited method
super.displayDetails(); // Invoke the super class display method
System.out.println("Working shift:" + shift);
}
}
package polymorphism;
/**
*
* @author giasutinhoc.vn
*/
public class EmployeeDetails {
public static void main(String[] args) {
// Instantiate the Employee class object
Employee objEmp = new Employee("E001", "Maria Nemeth", 40000);
objEmp.calcCommission(20000F); // Calculate commission
objEmp.displayDetails(); // Print the details
System.out.println("-------------------------");
// Instantiate the Employee object as PartTimeEmployee
Employee objEmp1 = new PartTimeEmployee("E002", "Rob Smith", 30000,"Day");
objEmp1.displayDetails(); // Print the details
}
}
Kết quả khi chạy chương trình