2011-07-03 41 views
10

Tôi có một câu hỏi.java Tham chiếu Integer

public class Jaba { 

    public static void main(String args[]) { 
     Integer i = new Integer(0);   
     new A(i); 
     System.out.println(i); 
     new B(i); 
     System.out.println(i); 
     int ii = 0;   
     new A(ii); 
     System.out.println(ii); 
     new B(ii); 
     System.out.println(ii);  
    } 

} 

class A { 

    public A(Integer i) { ++i; } 

} 

class B { 

    public B(int i) { ++i; } 

} 

Để tâm trí của tôi chuyển int \ Integer làm Integer cho hàm và tạo ++ trên tham chiếu đó nên thay đổi đối tượng bên dưới, nhưng đầu ra là 0 trong tất cả các trường hợp. Tại sao vậy?

Trả lời

3

Như đã nói trong các câu trả lời khác, Java chỉ có gọi theo giá trị và toán tử ++ chỉ ảnh hưởng đến biến, không phải đối tượng. Nếu bạn muốn mô phỏng gọi theo tham chiếu, bạn sẽ cần chuyển một đối tượng có thể thay đổi, như một mảng và sửa đổi các phần tử của nó.

API Java có một số đối tượng đặc biệt cho điều này, như java.util.concurrent.atomic.AtomicInteger (bổ sung cũng hoạt động trên nhiều luồng) và org.omg.CORBA.IntHolder (được sử dụng để gọi cho các cuộc gọi từ xa bằng cơ chế CORBA).

Nhưng bạn cũng có thể chỉ đơn giản là xác định số nguyên có thể thay đổi của riêng bạn:

class MutableInteger { 
    public int value; 
} 


class C { 
    public C(int[] i) { 
     ++i[0]; 
    } 
} 
class D { 
    public D(MutableInteger i) { 
     ++i.value; 
    } 
} 
class E { 
    public E(AtomicInteger i) { 
     i.incrementAndGet(); 
    } 
} 
public class Jaba { 
    public static void main(String args[]) { 

     int[] iii = new int[]{ 0 }; 
     System.out.println(iii[0]); 
     new C(iii); 
     System.out.println(iii[0]); 
     MutableInteger mi = new MutableInteger(); 
     System.out.println(mi.value); 
     new D(mi); 
     System.out.println(mi.value); 
     MutableInteger ai = new AtomicInteger(0); 
     System.out.println(ai); 
     new E(ai); 
     System.out.println(ai); 
    } 
} 
+0

ahahahahahah ahahahahahaha ahahahahahahahahahahahah XD – user3063349

+0

java chỉ thực hiện cuộc gọi bằng cách chia sẻ – user3063349

11

Hầu hết các lớp như Integer có nguồn gốc từ lớp trừu tượng Number của Java là bất biến., Sau khi được tạo, chúng chỉ có thể chứa số cụ thể đó.

Lợi ích hữu ích của việc này là nó cho phép lưu vào bộ nhớ cache. Nếu bạn gọi:

Integer i = Integer.valueOf(n); 

cho -128 <= n < 127 thay vì:

Integer i = Integer.new(n) 

bạn lấy lại một đối tượng lưu trữ, chứ không phải là một đối tượng mới. Điều này tiết kiệm bộ nhớ và tăng hiệu suất.

Trong trường hợp thử nghiệm thứ hai với một int luận trần, tất cả các bạn đang nhìn thấy là cách biến của Java được truyền bởi giá trị hơn bằng cách tham khảo.

+0

Cảm ơn rất nhiều người. Tôi đã giải quyết tình hình. – OneMoreVladimir

+1

Trên thực tế, lớp 'Số' đơn giản là trừu tượng và không trạng thái - và có các lớp con * có thể thay đổi * (AtomicInteger và AtomicLong là những thứ như vậy, và cũng có thể định nghĩa các lớp tùy chỉnh mới). –

+0

@Paulo điểm tốt - sẽ chỉnh sửa – Alnitak

5

@Alnitak -> chính xác. Và để thêm những gì thực sự xảy ra ở đây. ++ i do tính năng autoboxing hoạt động như sau:

int val = Integer.intValue(); ++val; 

và val không được lưu trữ ở bất kỳ đâu, do đó số gia tăng bị mất.

Các vấn đề liên quan