Vùng nhớ và khởi tạo đối tượng

import java.util.*;
import java.io.*;

//đây là class hs 
class hs {
	private int ms;//ngoài class hs (a.ms = 5) là gán giá trị
	private String ten;
	private float dtb;
	
	public void nhap_info() {
		Scanner nhap=new Scanner(System.in);//biến tên nhập
		ms=nhap.nextInt();
		nhap.nextLine();//cách để ignore bộ đệm 
		ten=nhap.nextLine();
		dtb=nhap.nextFloat();
	}
	public void xuat_info() {
		System.out.println("mssv " + ms);
		System.out.println("hoten " + ten);
		System.out.println("dtb " + dtb);
	}
	public void rank() {
		if(dtb<4)
			System.out.println("diem F");
		else if(dtb<5)
			System.out.println("diem D");
		else if(dtb<6.5)
			System.out.println("diem C");
		else if(dtb<8)
			System.out.println("diem B");
		else if(dtb<8.75)
			System.out.println("diem A");
		else
			System.out.println("diem A+");
	}
}
//private -> bạn chỉ có thể sử dụng trong class của nó thôi(trong class hs)
//public -> các class khác đều sử dụng đc
public class info_hs {
	public static void main(String[] args) {
		hs a = new hs();//a chỉ là tên định danh của class đó
		a.nhap_info();//từ class hs lấy ra hàm nhập
		a.xuat_info();
		a.rank();
	}
}

khi ta tạo biến hs a thì ở bộ nhớ stack có 1 vùng nhớ có kích thước tương đương với class hs vậy tại sao trong java phải khởi tạo 1 đối tượng sao ko khai báo rồi dùng luôn như struct và viêc khởi tạo như vậy thì tác động đến vùng nhớ như thế nào ? hay đó chỉ là giao thức phải có khi tạo 1 class ko riêng class mà mảng cũng thế đó có phải là cấp phát động ? và nếu đó là cấp phát động thì tại sao ko nó lại ko cần giải phóng khi ra khỏi hàm.

Hi Nguyễn Phú Thành.
Vì stack có kích thước nhỏ hơn help nhiều. Tạo nhiều trên stack có nguy cơ tèo.

2 Likes

đúng thế nhưng tại sao lại ko giải phóng khi ra khỏi hàm việc cấp phát động mà ko thu hồi rất dễ bị memory leak

Bạn cần xem bạn đang làm việc với ngôn ngữ nào…
Java đâu cần phải giải phóng, có GC rồi mà.

1 Like

GC nó làm heap giống với stack à ? tự động thu hồi khi ra khỏi khối lệnh or hàm ?

Cái này tùy vào thiết kế. Đối với mỗi ngôn ngữ một khác.
Với Java thì xem tại đây:

code mình đã ghi chú rất rõ ràng cái nào ra cái đó bạn lười đọc thì có mà mình viết tắt chỗ nào thế ?

a là local variable được lưu trên stack, nhưng hs là kiểu object, trong java object sẽ được lưu trên heap,

new hs()

sẽ tạo 1 object hs ở trên heap.

GC của JVM sẽ làm nhiệm vụ này, Còn khi nào GC làm nhiệm vụ này thì bạn đọc thêm ở đây:
https://daynhauhoc.com/t/java-memory-model-garbage-collection/33986

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?