Mọi người có bao giờ nghĩ sử dụng con trỏ trong java? Ồ tôi nghĩ là không, bởi vì java được thiết kế không dành cho những việc như vậy.

Lấy 1 ví dụ đơn giản, khi bạn muốn viết 1 chức năng swap 2 số như 1 chức năng riêng và có thể tái sử dụng thì sẽ ra sao nếu không có “con trỏ” nhỉ?
Ok tôi sẽ code như sau với java:

public class Main {
    public static void main(String[] args) {
        int a=3,b=2;
        swap(a,b);
        System.out.println("a: "+a+" \nb:"+b);
    }
    public static void swap(int a, int b){
        int x = a;
        a=b;b=x;
    }

Kết quả có vẻ không được như ý muốn nhỉ :)) a vẫn là 3 và b vẫn là 2. Nếu bn code với con trỏ thì quá dễ dàng rồi ví dụ với golang:

package main

import "fmt"
func swap(a, b *int) {
	tmp := *a
	*a = *b
	*b = tmp
}
func main() {
	a := 1
	b := 2
fmt.Printf("---fist---\n so a: %d \nso b: %d \n", a, b)
	swap(&a, &b)
fmt.Printf("---final---\nso a: %d \nso b: %d \n", a, b)
}

Và kết quả:

Go pointer

Đó là tư duy hướng chức năng, bạn muốn viết chức năng như swap chẳng hạn, thì viết chức năng riêng rồi pointer sẽ giúp truy cập vào địa chỉ bộ nhớ khi làm việc.

Với tư duy hướng đối tượng, như trên tiêu đề thì các đối tượng đều là các tham chiếu vì thế mà khi hoạt động dưới dạng đối tượng, thì chúng ta đang truy xuất gián tiếp tới 1 biến hay 1 bản ghi cụ thể.
Bây giờ hãy thử lại ví dụ swap trên với java:

public class Main {
    public static void main(String[] args) {
        Swap sp = new Swap();
        sp.a =1;
        sp.b =2;
        System.out.println("---fist---\n a: "+sp.a+" \nb:"+sp.b);
        // class
        sp.swap(sp.a, sp.b);
        System.out.println("---fist---\n a: "+sp.a+" \nb:"+sp.b);
    }
    public static void swap(int a, int b){
        int x = a;
        a=b;b=x;
    }
}
class Swap{
    public int a;
    public  int b;
    Swap(){};
    public void  swap(int a, int b){
        this.a=b;this.b=a;

    }
}

và kết quả:

java class

Ok mong rằng sẽ giải đáp được 1 phần sự tò mò về pointer của các bạn!
Chúc các bạn có một ngày code vui vẻ!