2011-11-15 26 views
55

Tôi gặp phải câu hỏi này trong một cuộc phỏng vấn và không thể đưa ra giải pháp. Tôi biết ngược lại có thể được thực hiện như được hiển thị trong What does the "+=" operator do in Java?Làm thế nào để bạn khai báo x và y sao cho x + = y đưa ra một lỗi biên dịch và x = x + y không?

Vì vậy, câu hỏi giống như dưới đây.

..... x = .....; 
..... y = .....; 

x += y; //compile error 
x = x + y; //works properly 
+0

Thật kỳ lạ, java có cho phép nối với dấu cộng không? Tôi không biết java, nhưng điều đó có vẻ giống như một khả năng – Ben

+0

@mazzzzz vừa được thử nghiệm, dường như không phải là giải pháp ở đây. + = hoạt động tốt để nối hai chuỗi. – mcfinnigan

+104

Thật là một câu hỏi phỏng vấn vô dụng. –

Trả lời

55

Hãy thử mã này

Object x = 1; 
String y = ""; 

x += y; //compile error 
x = x + y; //works properly 

không hoàn toàn chắc chắn lý do tại sao các công trình này, nhưng trình biên dịch nói

Nhà điều hành + = là undefined cho kiểu lập luận (s) Object, String

và tôi giả định rằng đối với dòng thứ hai, toString là ca lled vào Object.

EDIT:

Nó làm cho cảm giác như các nhà điều hành += là vô nghĩa trên một đối tượng nói chung. Trong ví dụ của tôi, tôi đúc một int để một đối tượng, nhưng nó chỉ phụ thuộc vào x phúc lợi của kiểu Object:

Object x = new Object(); 

Nó chỉ hoạt động nếu x là Object mặc dù, vì vậy tôi thực sự nghĩ rằng đó là hơn String là một trực tiếp phân lớp của đối tượng. Điều này sẽ không thành công cho x + y:

Foo x = new Foo(); 

cho các loại khác mà tôi đã thử.

+0

Darn, điều đó tốt. – DJClayworth

+1

Cảm ơn bạn. Tôi đã thử trong Eclipse và nó như bạn đã nói. Nhưng tôi nhận ra rằng trong NetBeans nó chỉ biên dịch mà không có bất kỳ lỗi nào. Vì vậy, nó có nghĩa là nó không phải là một vấn đề chung của java nhưng phụ thuộc vào trình biên dịch? – knshn

+6

x + = y nên biên dịch nếu x là Object và y là String, xem http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7058838 – x22

3

Không thể thực hiện được.

X x = ...; 
Y y = ...; 

x += y;   //1 
//equivalent to 
x = (X) (x+y); //2 

x = x+y;  //3 

Giả sử loại x+y là Z. # 2 yêu cầu chuyển đổi truyền từ Z sang X; # 3 yêu cầu chuyển đổi chuyển nhượng từ Z thành X. "chuyển đổi truyền được bao gồm nhiều hơn chuyển đổi chuyển nhượng" (1). Do đó, miễn là # 3 là hợp pháp, # 2 là hợp pháp và # 1 là hợp pháp.

Về phía ngược lại, có thể là # 1 là hợp pháp, nhưng # 3 là bất hợp pháp, ví dụ

byte x = 0; 
    int y = 1; 
    x+=y;  // ok, x=(byte)(x+y), cast int to byte is allowed. 
    x = x+y; // error, assign int to byte 

Thông tin này không có ích gì; đó là một lỗ hổng của Java tạo nên sự khác biệt đáng ngạc nhiên.

(1) http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.5

+4

Có thể, xem câu trả lời từ @Craigy. –

2
int i = 5; 
String s = "a"; 
System.out.println(i+=s); //Error 
System.out.println(i+s); // No error 

Về cơ bản, hoạt động cho bất kỳ đối tượng hoặc bất kỳ không theo chuỗi nguyên thủy và String kết hợp.

Tôi tự hỏi công ty đó là ai?:)

+0

Điều này không thực sự tương đương bởi vì ở đây chúng đang được chuyển đổi thành chuỗi trong khi chúng sẽ được chuyển thành một 'int' trong trường hợp thứ hai với' i = i + s' cung cấp lỗi biên dịch. – Craigy

1

điều này sẽ không luôn luôn cung cấp cho bạn lỗi biên dịch

Nếu bạn đang làm smoething như thế này:

class A{ 
public static void main(String args[]){ 
    String x = "10"; 
    String y = "s"; 
    x += y; 
    System.out.println(x); 
} 
} 

Nó sẽ làm việc tốt

ngay cả khi bạn làm

class A{ 
public static void main(String args[]){ 
    int x = 10; 
    float y = 11.5F; 
    x += y; 
    System.out.println(x); 
} 
} 

nó sẽ hoạt động bình thường.

Nhưng nếu bạn mất x và y hai loại khác nhau của các biến như:

class X{ 
} 
class A{ 
public static void main(String args[]){ 
    X x = new X(); 
    float y = 11.5F; 
    x += y; 
    System.out.println(x); 
} 
} 

Trong trường hợp này nó sẽ không biên dịch.

* Thậm chí bạn có thể concatinate bất kỳ int, float vv với chuỗi.

+0

Nhưng trong trường hợp này 'x + y' cũng sẽ thất bại và không chỉ' x + = y'. – nikhil