Lập trình hướng đối tượng với Java (Bài 2)

Lập trình hướng đối tượng với Java (Bài 2)

lap-trinh-huong-doi-tuong-java-7-1024x546
Lập trình Java cơ bản

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

lập trình hướng đối tượng java

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 java

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

lập trình hướng đối tượng java

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)

lập trình hướng đối tượng java

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

privateChỉ đượ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
lap trinh huong doi tuong java 8

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

lập trình hướng đối tượng java

Nhập tên lớp tại Class Name -> chọn Finish

lập trình hướng đối tượng java

Kết quả khi tạo thành công một class trong Netbeans IDE

lap trinh huong doi tuong java 7


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
lap trinh huong doi tuong java 12

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.
lap trinh huong doi tuong java 13

Lưu ý:

lap trinh huong doi tuong java 9

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

lap trinh huong doi tuong java 10
Alert: You are not allowed to copy content or view source !!