01/10/2018, 14:58

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.

Tao Không Ngu. viết 16:59 ngày 01/10/2018

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.

Nguyễn Phú Thành viết 17:15 ngày 01/10/2018

đú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

Dark.Hades viết 17:07 ngày 01/10/2018

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à.

Nguyễn Phú Thành viết 17:14 ngày 01/10/2018

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 ?

Dark.Hades viết 17:07 ngày 01/10/2018

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:

stackoverflow.com
Adit A. Pillai

Java stack and heap memory management

java, memory, memory-management, heap-memory
asked by Adit A. Pillai on 11:34AM - 13 Dec 16

Nguyễn Phú Thành viết 17:14 ngày 01/10/2018

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ế ?

Nguyen Ca viết 17:13 ngày 01/10/2018

hs a = new hs();//a chỉ là tên định danh của class đó

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.

đú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

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

Bài liên quan
0