Pass By Value and Pass By Reference

hungsao

New Member
14/7/11
14
0
0
Các sư huynh giúp em sáng tỏ vấn đề này với ! Rốt cuộc là có Pass By Reference hay không ?

Các huynh cho em 1 ví dụ về Pass By Reference và Pass By Value

p/s : những gì em tìm thấy sau đây không biết có đúng không nữa :(

I.Java is strictly ‘Pass By Value’
nguồn : http://javapapers.com/core-java/java-pass-by-value-and-pass-by-reference/

II. Xem ví dụ ở file nguồn
Question : If Java uses the pass-by reference, why won't a swap function work?

Java does manipulate objects by reference, and all object variables are references. However, Java doesn't pass method arguments by reference; it passes them by value.

nguồn : http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
 
20/5/10
144
2
18
Ðề: Pass By Value and Pass By Reference

Thật sự tới giờ mình vẫn chưa viết được hàm đổi giá trị của hai số int bằng java (hic hic)
Mà hình như java chỉ hỗ trợ truyền bằng giá trị đối với kiểu dữ liêu nguyên thủy (primitives types), ko pass by referrence đc
Mỗi ngôn ngữ có cái ưu điểm và cũng có cái nhược điểm của nó. Code java nó không đươc tự do mọi việc như trong C++(cơ bản như destructor, quản lí bộ nhớ chẳng hạn...) nhưng bù lại nó là một công nghệ với nhiều ưu điểm khác
 
20/5/10
144
2
18
Ðề: Pass By Value and Pass By Reference

Ah`, một điều nữa là khi xử lí với object thì sẽ xử lí theo kiểu tham chiếu, ngược lại khi xử lí kiẻu nguyên thủy. Điều này lưu ý trong các phép toán số học áp dụng lên đối tượng.
Túm lại đối với kiẻu dữ liệu nguyên thủy thì pass by value, còn đối tượng thì pass by reference :-B
 

tauit_dnmd

Member
7/11/10
114
1
16
UIT
Ðề: Pass By Value and Pass By Reference

Java chỉ có 1 kiểu truyền biến là pass by value.
Tôi biết có nhiều bạn sẽ chém tôi với ý kiến trên ,nhưng các bạn hãy tìm hiểu cho kĩ .

Trích dẫn từ alo_toinghe:
Túm lại đối với kiẻu dữ liệu nguyên thủy thì pass by value, còn đối tượng thì pass by reference
Biến của 1 class không truyền theo reference ( hãy phân biệt giá trị của vùng nhớ mà 1 biến tham chiếu tới giá trị của biến )
Bởi vì Java chỉ có 1 cách truyền biến là pass by value.
 
10/12/10
285
10
18
Ðề: Pass By Value and Pass By Reference

Java chỉ có 1 kiểu truyền biến là pass by value.
Tôi biết có nhiều bạn sẽ chém tôi với ý kiến trên ,nhưng các bạn hãy tìm hiểu cho kĩ .


Biến của 1 class không truyền theo reference ( hãy phân biệt giá trị của vùng nhớ mà 1 biến tham chiếu tới giá trị của biến )
Bởi vì Java chỉ có 1 cách truyền biến là pass by value.
Bạn chứng mình điều Bạn nói đi :-o
 
20/5/10
144
2
18
Ðề: Pass By Value and Pass By Reference

Java chỉ có 1 kiểu truyền biến là pass by value.
Tôi biết có nhiều bạn sẽ chém tôi với ý kiến trên ,nhưng các bạn hãy tìm hiểu cho kĩ .


Biến của 1 class không truyền theo reference
( hãy phân biệt giá trị của vùng nhớ mà 1 biến tham chiếu tới giá trị của biến )
Tất nhiên biến của môt class ko truyền theo reference, bởi vì nó là kiểu dữ liệu nguyên thủy. Và kiểu dữ liệu nguyên thủy thì truyền theo.....
Bạn hãy tìm hiểu lại xem, truyền đối số cho hàm là đối tượng (kiểu dữ liệu k nguyên thủy) ;))
 
20/5/10
144
2
18
Ðề: Pass By Value and Pass By Reference

Khi truyền bằng đối tượng, thât chất nó không truyền bằng giá trị (bởi vì một đối tượng chẳng có giá trị cụ thể nào) mà sẽ truyền địa chỉ của đối tượng đó. Có phải pass by value mà bạn nói có phải là value của dịa chỉ vùng nhớ đó.

Mình chứng minh là truyền đối tượng sẽ truyền bằng reference và int sẽ bằng value trước nhé
Bạn có thấy có j khác khi java đối xử với một đối tượng và một biến dữ liệu nguyên thủy. nếu khác nhau thì chứng tỏ không thể chỉ có duy nhất một cách truyền nhé


PHP:
class A{
	private int i;
	public A(int a){
		i = a;
	};
	public void set(int a){
		i = a;
	};
	public int get(){
		return i;
	};
};
class B{
	public static void change(A a){
		a.set(5);
		System.out.println("Gia tri cua i trong doi tuong a o trong ham " + a.get());
	};
	public static void change(int i){
		i = 5;
		System.out.println("Gia tri cua i trong ham " + i);
	};
	public static void main(String[] args){
		A a = new A(3);
		int i = 3;
		System.out.println("Gia tri cua i trong doi tuong a o ngoai ham " + a.get());
		change(a);
		System.out.println("Gia tri cua i trong doi tuong a sau khi goi ham " + a.get());
		/*--------------*/
		System.out.println("Gia tri cua i ngoai ham " + i);
		change(i);
		System.out.println("Gia tri cua i sau khi goi ham " + i);
	};
};
 

tauit_dnmd

Member
7/11/10
114
1
16
UIT
Ðề: Pass By Value and Pass By Reference

Hi. Tất cả những j bạn làm điều dùng 1 cơ chế: pass by value.
-Mọi người đang lầm ở chỗ: giá trị tại vùng nhớ mà 1 biến object tham chiếu tới biến object .
@alo_toinghe:
- đối tượng a của class chứa tham chiếu tới data nằm trên mem ( vậy trong a chỉ chứa cái tham chiếu - suy nghĩ đơn giản là a chứa địa chỉ vùng nhớ mà nó trỏ tới)
+hàm change(A a) của bạn chỉ thay đổi đc giá trị tại vùng nhớ mà a tham chiếu tới.
+Chứ giá trị mà a chứa không thay đổi đc .Tất cả là do cơ chế pass by value ( tất cả đều vậy)

-Hay xem quá trình copy khi gọi hàm change(A a)

 
20/5/10
144
2
18
Ðề: Pass By Value and Pass By Reference


- đối tượng a của class chứa tham chiếu tới data nằm trên mem ( vậy trong a chỉ chứa cái tham chiếu - suy nghĩ đơn giản là a chứa địa chỉ vùng nhớ mà nó trỏ tới)
+hàm change(A a) của bạn chỉ thay đổi đc giá trị tại vùng nhớ mà a tham chiếu tới.
[/B]
Vậy bạn muốn phải thay đổi cái j nữa.


+Chứ giá trị mà a chứa không thay đổi đc .Tất cả là do cơ chế pass by value ( tất cả đều vậy)


Xem lai sau khi gọi hàm nó có thay đổi k
 

tauit_dnmd

Member
7/11/10
114
1
16
UIT
Ðề: Pass By Value and Pass By Reference

Vậy bạn muốn phải thay đổi cái j nữa.



Xem lai sau khi gọi hàm nó có thay đổi k
a chứa cái j bạn biết không? Nó chứa tham chiếu ( môn na cứ nghĩ như là chứa địa chỉ vùng nhớ ) ==> nên khi thoát hàm cái giá trị này không thay đổi ( không thay đổi đc tham chiếu ,nghĩa là trước khi gọi hàm a tham chiếu tới đâu thì sau khi gọi hàm a vẫn tham chiếu tới đó dù cho trong hàm chúng ta có cố gắng thay đổi tham chiếu đi chăng nữa )
OK?
-Nếu bạn vẫn chưa thông thì mình xin hỏi bạn 3 câu đơn giản sau ( tất cả mình đang đề cập đến các kiểu dữ liệu không nguyên thủy nha):
+ Pass by ref là j?
+1 Biến đối tượng thực chất chứa cái j?
+1 biến object đó nằm trên Stack hay heap, vùng nhớ nó tham chiếu tới nằm trên stack hay heap ( ví dụ nè: A a=new A(2); --> thì a đc lưu ở đâu? , vùng nhớ mà a tham chiếu tới lưu ở đâu? )

P/S:
Bạn xem kĩ cái hình mà mình đưa lên chưa? Có thấy công việc copy tham chiếu ( nôm na hiểu như là copy địa chỉ) không ?
Nếu có cơ chế truyền biến theo pass by ref thì : "Đã viết đc hàm swap đúng nghĩa như C++/C# rồi bạn à".
Tóm lại bạn vẫn cứ đang nhầm lẫn giữa 2 cái : vùng nhớ mà 1 biến object tham chiếu tới và giá trị chứa trong biến object đó.
JAVA chỉ có 1 kiểu truyền biến vô hàm là pass bye value .