NỘI DUNG BÀI HỌC
✳️ Các loại phạm vi truy cập
✳️ Hàm xây dựng Contructor trong Java
✅ Access Modifier (phạm vi truy cập) trong java
Bảng dưới đây mô tả khả năng truy cập của các Access Modifier trong java:
Access Modifier |
Trong lớp |
Trong package |
Ngoài package bởi lớp con |
Ngoài package |
---|---|---|---|---|
Private |
Y |
N |
N |
N |
Default |
Y |
Y |
N |
N |
Protected |
Y |
Y |
Y |
N |
Public |
Y |
Y |
Y |
Y |
Hình ảnh minh họa:
✅ Phạm vi truy cập là gì?
Phạm vi truy cập (access modifiers) là xác định độ truy cập phạm vi vào dữ liệu của các thuộc tính, phương thức hoặc class.
Package (gói) là nhóm các class, interface hoặc các package con liên quan lại với nhau. Việc dùng package dùng để nhóm các class liên quan với nhau thành thư viện như thư viện swing, awt,…Ngoài ra, mục đích của package ngăn cản xung đột đặt tên, điều kiện truy cập, thuận tiện tìm kiếm và lưu trữ.
Các loại phạm vi truy cập
Có 4 loại phạm vi truy cập:
-
Private
-
(Default)
-
Protected
-
Public
1. Phạm vi truy cập Private
Private Access Modifier chỉ được truy cập trong phạm vi lớp.
Ví dụ về private access modifier trong java
Trong ví dụ, chúng ta tạo 2 lớp A và Simple. Lớp A chứa biến và phương thức được khai bao là private. Chúng ta cố gắng truy cập chúng từ bên ngoài lớp A. Điều này dẫn đến Compile time error:
class A {
private int data = 40;
private void msg() {
System.out.println("Hello java");
}
}
public class Simple {
public static void main(String args[]) {
A obj = new A();
System.out.println(obj.data);// Compile Time Error
obj.msg();// Compile Time Error
}
}
Vai trò của Private Constructor
Nếu bạn tạo bất kỳ constructor là private trong lớp, bạn sẽ không thể tạo instance của class bên ngoài nó. Ví dụ:
class A {
private A() {
}//private constructor
public void msg() {
System.out.println("Hello java");
}
}
public class Simple {
public static void main(String args[]) {
A obj = new A();//Compile Time Error
}
}
Chú ý: Một lớp không thể là private hoặc protected, ngoại trừ lớp lồng nhau.
2. Phạm vi truy cập Default
Nếu bạn không khai báo modifier nào, thì nó chính là trường hợp mặc định. Default Access Modifier là chỉ được phép truy cập trong cùng package.
Ví dụ về Default Access Modifier trong Java
package anhtester.demo;
class A {
void msg() {
System.out.println("Hello");
}
}
package anhtester.mypack;
import anhtester.demo.*;
public class B {
public static void main(String args[]) {
A obj = new A(); // Compile Time Error
obj.msg(); // Compile Time Error
}
}
Trong ví dụ trên, phạm vi truy cập của lớp A và phương thức của msg() của nó là mặc định nên chúng không thể được truy cập từ bên ngoài package.
3. Phạm vi truy cập Protected
Protected access modifier được truy cập bên trong package và bên ngoài package nhưng phải kế thừa.
Protected access modifier có thể được áp dụng cho biến, phương thức, constructor. Nó không thể áp dụng cho lớp.
Ví dụ về protected access modifier trong Java:
// Tại package anhtester.demo
package anhtester.demo;
public class A {
protected void msg() {
System.out.println("Hello");
}
}
// Tại package anhtester.mypack
package anhtester.mypack;
import anhtester.demo.*;
public class B extends A {
public static void main(String args[]) {
B obj = new B();
obj.msg();
}
}
Kết quả:
Hello
4. Phạm vi truy cập public
Public access modifier được truy cập ở mọi nơi.
Ví dụ về public access modifier trong java:
// Tại package anhtester.demo
package anhtester.demo;
public class A {
protected void msg() {
System.out.println("Hello");
}
}
Tạo class B ở package khác và không cần kế thừa
// Tại package anhtester.mypack
package anhtester.mypack;
import anhtester.demo.*;
public class B {
public static void main(String args[]) {
B obj = new B();
obj.msg();
}
}
Kết quả:
Hello
Như vậy chúng ta đã tìm hiểu các loại phạm vi truy cập trong lập trình hướng đối tượng
✳️ Hàm xây dựng Contructor trong Java
Trong Java, Constructor (hay còn gọi là hàm khởi tạo hoặc hàm xây dựng) là một hàm chứa khối mã tương tự như phương thức. Nó được gọi khi một thể hiện của class được tạo. Tại thời điểm gọi hàm tạo, bộ nhớ dành cho đối tượng được phân bổ.
Nó là một loại phương thức đặc biệt được sử dụng để khởi tạo đối tượng.
Mỗi khi một đối tượng được tạo bằng cách sử dụng từ khóa new(), có ít nhất một hàm tạo được gọi. Nó gọi một hàm tạo mặc định (default constructor) nếu không có hàm tạo nào trong class. Trong trường hợp như vậy, trình biên dịch Java cung cấp một hàm tạo mặc định theo mặc định.
Có hai loại hàm tạo trong Java:
- Hàm tạo không có đối số
- Hàm tạo tham số.
Lưu ý: Nó được gọi là hàm tạo (hàm xây dựng) vì nó xây dựng các giá trị tại thời điểm tạo đối tượng. Không cần thiết phải viết một constructor cho một class. Đó là bởi vì trình biên dịch java tạo ra một hàm tạo mặc định nếu class của bạn không có hàm tạo nào.
1. Quy tắc để tạo Hàm tạo (hàm xây dựng)
Có 3 quy tắc để tạo ra một hàm tạo:
- Tên hàm tạo phải giống với tên class của nó
- Một hàm tạo phải không có kiểu trả về rõ ràng
- Một hàm tạo Java không thể abstract, static, final và được đồng bộ hóa
Lưu ý: Chúng ta có thể sử dụng các từ khóa sửa đổi truy cập (access modifier) trong khi khai báo một hàm tạo. Nó kiểm soát việc tạo đối tượng. Nói cách khác, chúng ta có thể có hàm tạo private, protected, public hoặc mặc định trong Java.
2. Các loại Hàm tạo
Có 2 loại hàm tạo trong Java:
- Hàm tạo không có đối số
- Hàm tạo tham số.
3. Hàm tạo mặc định
Hàm tạo được gọi là Hàm tạo mặc định (Default Constructor) khi nó không có bất kỳ tham số nào.
3.1. Cú pháp hàm tạo mặc định
<class_name>(){
}
3.2. Ví dụ về hàm tạo mặc định
Trong ví dụ này, chúng ta đang tạo hàm tạo không có đối số trong class Bike1. Nó sẽ được gọi vào thời điểm tạo đối tượng.
//Java Program to create and call a default constructor
class Bike1 {
// Tạo hàm tạo mặc định
Bike1() {
System.out.println("Bike1 được tạo");
}
//main method
public static void main(String args[]) {
// Gọi hàm tạo mặc định
Bike1 b = new Bike1();
}
}
Kết quả:
Bike1 được tạo
Lưu ý: Nếu không có hàm tạo nào được tạo trong một class, trình biên dịch sẽ tự động tạo một hàm tạo mặc định.
3.3. Ví dụ về hàm tạo mặc định hiển thị giá trị mặc định
// Hãy thử một ví dụ hàm tạo khác
// để tạo hiển thị giá trị mặc định
class Student3 {
int id;
String name;
// Phương thức hiển thị id và name
void display() {
System.out.println(id + " " + name);
}
public static void main(String args[]) {
// Tạo đối tượng
Student3 s1 = new Student3();
Student3 s2 = new Student3();
// Hiển thị giá trị của đối tượng
s1.display();
s2.display();
}
}
Kết quả:
0 null
0 null
Giải thích: Trong class Student3 trên, bạn không tạo bất kỳ hàm tạo nào để trình biên dịch tự động cung cấp cho bạn một hàm tạo mặc định. Ở đây giá trị 0 và null được cung cấp bởi hàm tạo mặc định.
4. Hàm tạo có tham số
Hàm tạo có số lượng tham số cụ thể được gọi là hàm tạo tham số.
4.1. Ví dụ về hàm tạo tham số
Trong ví dụ này, chúng tôi đã tạo ra hàm tạo của class Student có hai tham số. Chúng ta có thể có nhiều tham số.
// Ví dụ về hàm tạo tham số trong Java.
class Student4 {
int id;
String name;
// Tạo một hàm tạo tham số
Student4(int i, String n) {
id = i;
name = n;
}
// Phương thức hiển thị giá trị
void display() {
System.out.println(id + " " + name);
}
public static void main(String args[]) {
// Tạo đối tượng và truyền giá trị
Student4 s1 = new Student4(17, "Hải");
Student4 s2 = new Student4(18, "Doanh");
// Gọi phương thức hiển thị dữ liệu
s1.display();
s2.display();
}
}
Kết quả:
17 Hải
18 Doanh
5. Constructor Overloading trong Java
Trong Java, một hàm tạo giống như một phương thức nhưng không có kiểu trả về. Nó cũng có thể bị quá tải (overloading) như các phương thức trong Java.
Constructor Overloading trong Java là một kỹ thuật có nhiều hơn một hàm tạo với các danh sách tham số khác nhau.
Chúng được sắp xếp theo cách mà mỗi constructor hiện một nhiệm vụ khác nhau.
Chúng được trình biên dịch phân biệt bởi số lượng tham số và kiểu dữ liệu của tham số của chúng.
5.1. Ví dụ về Constructor Overloading trong Java
// Chương trình ví dụ về Constructor Overloading trong Java
class Student5 {
int id;
String name;
int age;
// Tạo hàm tạo với 2 tham số
Student5(int i, String n) {
id = i;
name = n;
}
// Tạo hàm tạo với 3 tham số
Student5(int i, String n, int a) {
id = i;
name = n;
age = a;
}
void display() {
System.out.println(id + " " + name + " " + age);
}
public static void main(String args[]) {
Student5 s1 = new Student5(17, "Hải");
Student5 s2 = new Student5(18, "Doanh", 21);
s1.display();
s2.display();
}
}
Kết quả
17 Hải 0
18 Doanh 21
6. Sự khác biệt giữa Constructor và Method trong Java
Có nhiều sự khác biệt giữa các constructor và method:
Java Constructor | Java Method |
---|---|
Một constructor được sử dụng để khởi tạo trạng thái của một đối tượng. | Một phương thức được sử dụng để làm hành vi của một đối tượng. |
Một constructor không được có kiểu trả về. | Một phương thức phải có kiểu trả về |
Constructor được gọi ngầm và rõ ràng | Một phương thức được gọi rõ ràng |
Trình biên dịch Java cung cấp một Constructor mặc định nếu không có constructor nào được tạo | Không có phương thức nào được cung cấp bởi trình biên dịch |
Tên của constructor phải giống với tên của class | Tên phương thức thì có thể giống hoặc khác tên class |
7. Copy Constructor trong Java
Không copy được constructor trong Java. Tuy nhiên, chúng ta có thể sao chép các giá trị từ đối tượng này sang đối tượng khác.
Có nhiều cách để sao chép các giá trị của một đối tượng vào một đối tượng khác trong Java:
- Bằng constructor
- Bằng cách gán các giá trị của một đối tượng vào một đối tượng khác
- Theo phương thức clone() của class Object
Trong ví dụ này, chúng ta sẽ sao chép các giá trị của một đối tượng sang đối tượng khác bằng cách sử dụng hàm tạo trong Java.
// Ví dụ sao chép giá trị của một đối tượng sang đối tượng khác
class Student6 {
int id;
String name;
// Hàm tạo
Student6(int i, String n) {
id = i;
name = n;
}
// Hàm tạo để khởi tạo một đối tượng khác
Student6(Student6 s) {
id = s.id;
name = s.name;
}
void display() {
System.out.println(id + " " + name);
}
public static void main(String args[]) {
Student6 s1 = new Student6(17, "Hải");
Student6 s2 = new Student6(s1);
s1.display();
s2.display();
}
}
Kết quả:
17 Hải
17 Hải
Hỏi #1: Mục đích của hàm tạo mặc định là gì?
Trả lời: Hàm tạo mặc định được sử dụng để cung cấp các giá trị mặc định cho đối tượng như 0, null, v.v., tùy thuộc vào loại.
Hỏi #2: Mục đích của hàm tạo tham số là gì?
Trả lời: Hàm tạo tham số được sử dụng để cung cấp các giá trị khác nhau cho các đối tượng riêng biệt. Tuy nhiên, bạn cũng có thể cung cấp các giá trị tương tự.
Hỏi #3: Liệu constructor có trả về giá trị nào không?
Trả lời: Có, đó là thể hiện của lớp hiện tại (Bạn không thể sử dụng kiểu trả về nhưng nó trả về một giá trị).
Hỏi #4: Constructor có thể thực hiện các nhiệm vụ khác thay vì khởi tạo?
Trả lời: Có, giống như tạo đối tượng, bắt đầu một luồng, gọi một phương thức, v.v. Bạn có thể thực hiện bất kỳ thao tác nào trong hàm tạo khi bạn thực hiện trong phương thức.
Hỏi #5: Có class Constructor trong Java không?
Trả lời: Có
Hỏi #6: Mục đích của class Constructor là gì?
Trả lời: Java cung cấp một class Constructor có thể được sử dụng để lấy thông tin nội bộ của constructor trong class. Bạn sẽ thấy nó trong package java.lang.reflect.