Bài 6: Lớp và Đối tượng (Classes and Objects) trong Java
I. Constructor
Định nghĩa Constructor:
Constructor là một phương thức đặc biệt được gọi khi một đối tượng của lớp được tạo ra. Constructor có tên trùng với tên lớp và không có kiểu trả về (ngay cả void). Constructor được sử dụng để khởi tạo các thuộc tính của đối tượng.
Các loại Constructor:
Default Constructor (Constructor mặc định):
Được cung cấp bởi Java nếu không có constructor nào được định nghĩa trong lớp.
Không có tham số.
Parameterized Constructor (Constructor có tham số):
Được định nghĩa bởi lập trình viên.
Chấp nhận các tham số để khởi tạo đối tượng với các giá trị cụ thể.
Constructor Chaining:
Constructor chaining xảy ra khi một constructor gọi một constructor khác trong cùng một lớp hoặc lớp cha. Điều này được thực hiện bằng cách sử dụng từ khóa this hoặc super.
Ví dụ cụ thể:
public class Person {
private String name;
private int age;
// Default Constructor
public Person() {
this.name = "Unknown";
this.age = 0;
}
// Parameterized Constructor
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Constructor Chaining
public Person(String name) {
this(name, 0); // Gọi constructor có tham số (String, int)
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public static void main(String[] args) {
Person person1 = new Person();
Person person2 = new Person("Alice", 30);
Person person3 = new Person("Bob");
System.out.println("Person1: " + person1.getName() + ", " + person1.getAge());
System.out.println("Person2: " + person2.getName() + ", " + person2.getAge());
System.out.println("Person3: " + person3.getName() + ", " + person3.getAge());
}
}
II. Overloading
Phương thức Overloading (Nạp chồng phương thức):
Overloading xảy ra khi một lớp có nhiều phương thức cùng tên nhưng khác nhau về danh sách tham số (số lượng hoặc kiểu dữ liệu của tham số). Overloading giúp cải thiện tính linh hoạt và khả năng đọc của mã nguồn.
Constructor Overloading (Nạp chồng constructor):
Constructor overloading là khi một lớp có nhiều constructor với cùng tên nhưng khác nhau về danh sách tham số. Điều này cho phép tạo các đối tượng với các cách khởi tạo khác nhau.
Ví dụ cụ thể:
public class Calculator {
// Overloaded method for adding two integers
public int add(int a, int b) {
return a + b;
}
// Overloaded method for adding three integers
public int add(int a, int b, int c) {
return a + b + c;
}
// Overloaded method for adding two double values
public double add(double a, double b) {
return a + b;
}
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println("Sum of two integers: " + calc.add(5, 10));
System.out.println("Sum of three integers: " + calc.add(5, 10, 15));
System.out.println("Sum of two doubles: " + calc.add(5.5, 10.5));
}
}
III. Overriding
Phương thức Overriding (Ghi đè phương thức):
Overriding xảy ra khi một lớp con định nghĩa lại một phương thức của lớp cha với cùng tên, cùng kiểu trả về và cùng danh sách tham số. Overriding cho phép lớp con cung cấp cách triển khai cụ thể cho phương thức đó.
Sử dụng super keyword:
Từ khóa super được sử dụng để gọi phương thức của lớp cha từ lớp con, đặc biệt hữu ích khi cần giữ lại một phần hành vi của lớp cha trong phương thức ghi đè.
Ví dụ cụ thể:
class Animal {
void sound() {
System.out.println("This animal makes a sound.");
}
}
class Dog extends Animal {
@Override
void sound() {
super.sound(); // Gọi phương thức sound() của lớp cha
System.out.println("The dog barks.");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.sound(); // Gọi phương thức sound() của Dog
}
}
IV. Bài tập thực hành
Bài tập: Tạo một hệ thống quản lý sản phẩm sử dụng các khái niệm constructor, overloading và overriding.
Yêu cầu:
Tạo một lớp
Productvới các thuộc tínhid,name, vàprice.Định nghĩa các constructor cho lớp
Product, bao gồm constructor mặc định và constructor có tham số.Tạo lớp
Electronicskế thừa từ lớpProductvà ghi đè phương thứcdisplayDetails.Định nghĩa các phương thức
displayDetailsđể hiển thị thông tin sản phẩm.Viết chương trình chính để tạo các đối tượng và hiển thị thông tin của chúng.
Mã nguồn mẫu:
class Product {
private int id;
private String name;
private double price;
// Default Constructor
public Product() {
this.id = 0;
this.name = "Unknown";
this.price = 0.0;
}
// Parameterized Constructor
public Product(int id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
public void displayDetails() {
System.out.println("Product ID: " + id);
System.out.println("Product Name: " + name);
System.out.println("Product Price: $" + price);
}
}
class Electronics extends Product {
private String brand;
// Constructor chaining
public Electronics(int id, String name, double price, String brand) {
super(id, name, price);
this.brand = brand;
}
@Override
public void displayDetails() {
super.displayDetails();
System.out.println("Brand: " + brand);
}
}
public class Main {
public static void main(String[] args) {
Product product = new Product(1, "Generic Product", 100.0);
Electronics laptop = new Electronics(2, "Laptop", 1500.0, "Dell");
System.out.println("Product Details:");
product.displayDetails();
System.out.println();
System.out.println("Electronics Details:");
laptop.displayDetails();
}
}
Tổng kết
Bài học này cung cấp một cái nhìn chi tiết về lớp và đối tượng trong Java, bao gồm constructor, overloading, overriding và cách sử dụng chúng trong lập trình. Việc nắm vững các khái niệm này sẽ giúp bạn xây dựng các hệ thống phần mềm linh hoạt và mạnh mẽ, cải thiện hiệu quả phát triển phần mềm.