2013-12-18 29 views
5

Tôi có câu hỏi về các giá trị boolean trong Java. Giả sử tôi có một chương trình như sau:Thay đổi giá trị boolean?

boolean test = false; 
... 
foo(test) 
foo2(test) 

foo(Boolean test){ 
    test = true; 
} 
foo2(Boolean test){ 
    if(test) 
    //Doesn't go in here 
} 

Tôi nhận thấy rằng trong foo2, phép thử boolean không thay đổi và do đó không đi vào câu lệnh if. Làm thế nào tôi sẽ đi về việc thay đổi nó sau đó? Tôi nhìn vào giá trị Boolean nhưng tôi không thể tìm thấy một chức năng mà sẽ "thiết lập" thử nghiệm từ đúng sang sai. Nếu có ai có thể giúp tôi thì điều đó thật tuyệt.

+2

Java của bạn được truyền theo giá trị. Biến biến một biến mẫu và sửa đổi và kiểm tra biến đó. –

+0

@SotiriosDelimanolis Yes. Nhưng giá trị của một java.lang.Object (và các kiểu con, đó là bất kỳ kiểu nguyên thủy nào) là địa chỉ tham chiếu. –

+0

@ElliottFrisch Tôi không thấy _but_ xuất hiện ở đâu. –

Trả lời

4

Bạn đang đi qua giá trị của một boolean nguyên thủy đến chức năng của bạn, không có "tham khảo". Vì vậy, bạn chỉ đang che giấu giá trị trong phương thức foo của mình. Thay vào đó, bạn có thể muốn sử dụng một trong các cách sau -

Một Chủ

public static class BooleanHolder { 
    public Boolean value; 
} 

private static void foo(BooleanHolder test) { 
    test.value = true; 
} 

private static void foo2(BooleanHolder test) { 
    if (test.value) 
    System.out.println("In test"); 
    else 
    System.out.println("in else"); 
} 

public static void main(String[] args) { 
    BooleanHolder test = new BooleanHolder(); 
    test.value = false; 
    foo(test); 
    foo2(test); 
} 

Những kết quả đầu ra "Trong thử nghiệm".

Hoặc, bằng cách sử dụng một

viên biến

private boolean value = false; 

public void foo() { 
    this.value = true; 
} 

public void foo2() { 
    if (this.value) 
    System.out.println("In test"); 
    else 
    System.out.println("in else"); 
} 

public static void main(String[] args) { 
    BooleanQuestion b = new BooleanQuestion(); 
    b.foo(); 
    b.foo2(); 
} 

nào, cũng kết quả đầu ra "Trong thử nghiệm".

+0

Với cách tiếp cận Holder, bạn sẽ cần phải tạo một tập tin mới gọi là BooleanHolder sau đó bởi vì nó là công khai? – user1871869

+0

Tôi đã viết nó với một [Lớp lồng nhau] (http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html), nhưng bạn có thể (nhưng sau đó nó sẽ không phải là một lớp lồng nhau tĩnh) . –

1

Bạn đặt tên tham số của mình giống như biến mẫu. Ở đây, tham số là tham số được tham chiếu, không phải là biến mẫu. Điều này được gọi là "bóng tối", trong đó tên đơn giản test làm tên tham số đổ bóng biến thể hiện cũng được gọi là test.

Trong foo, bạn đã thay đổi thông số test thành true, không phải biến mẫu test, không thay đổi. Điều đó giải thích tại sao nó không đi vào khối if trong foo2.

Để chỉ định giá trị, hãy loại bỏ thông số trên foo hoặc sử dụng this.test để tham chiếu biến mẫu.

this.test = true; 

if (this.test) 
+0

Hm, với phương pháp này tôi nhận được một lỗi nói: lỗi: biến không tĩnh này không thể được tham chiếu từ một bối cảnh atic st – user1871869

0

Phương thức foo của bạn đã thay đổi giá trị test thành true. Có vẻ như những gì bạn muốn là sử dụng các biến mẫu cho mỗi hàm.

boolean test = false; 
... 
foo(test) 
foo2(test) 

foo(Boolean test){ 
    this.test = true; 
} 
foo2(Boolean test){ 
    if(this.test) 
    //Doesn't go in here 
} 

Bằng cách này, phương pháp của bạn chỉ thay đổi giá trị của test bên trong của phương pháp đó, nhưng test tham số công cộng của bạn luôn bên một giá trị false.

1

Bạn cần phải nhận thức rằng:

  1. Trong Java, đối số là pass-by-value.
  2. Boolean, loại trình bao bọc boolean, là không thay đổi.

Vì 1 và 2, bạn không có cách nào thay đổi trạng thái của đường Boolean trong phương thức.

Bạn chủ yếu có 2 sự lựa chọn:

Choice 1: Có một người giữ có thể thay đổi cho boolean như:

class BooleanHolder { 
    public boolean value; // better make getter/setter/ctor for this, just to demonstrate 
} 

như vậy trong mã của bạn nó sẽ giống như thế:

void foo(BooleanHolder test) { 
    test.value=true; 
} 

Lựa chọn 2: Lựa chọn hợp lý hơn: trả về giá trị từ phương pháp của bạn:

boolean foo(boolean test) { 
    return true; // or you may do something else base on test or other states 
} 

người gọi nên sử dụng nó như:

boolean value= false; 
value = foo(value); 
foo2(value); 

Cách tiếp cận này là preferrable vì nó phù hợp hơn với thông lệ Java mã hóa bình thường, và bằng chữ ký phương pháp nó mang lại gợi ý cho người gọi rằng nó đang xảy ra để trả lại cho bạn một cơ sở giá trị mới trên đầu vào

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