Khi bạn viết:
OddEven number = new OddEven();
Bạn thực sự làm hai việc: 1) bạn khai báo một biến number
loại OddEven
và 2) bạn gán một tham chiếu đến một thể hiện mới của lớp OddEven
. Nhưng vì một biến có thể chứa bất kỳ kiểu con nào của một kiểu, việc viết number = new OddEven();
sẽ không đủ để trình biên dịch biết loại thực của biến số number
. Vì vậy, bạn phải khai báo nó quá.Java là ngôn ngữ được nhập mạnh mẽ, có nghĩa là mọi biến và mọi biểu thức đều có loại được biết tại thời gian biên dịch. Bạn có thể muốn đọc toàn bộ số Chapter 4. Types, Values, and Variables của Đặc tả Ngôn ngữ Java (JLS) để tìm hiểu thêm về điều này.
Bây giờ, khi bạn viết:
String str = "abc";
Mọi thứ một chút khác nhau. Các ký tự được kèm theo dấu ngoặc kép, "abc"
tại đây, được gọi là chuỗi ký tự đã được tham chiếu đến một phiên bản String
và luôn đề cập đến cùng một phiên bản của lớp String
. Trích dẫn phần 3.10.5 String Literals của JLS:
Mỗi chuỗi chữ là một tài liệu tham khảo (§4.3) đến một instance (§4.3.1, §12.5) của lớp String
(§4.3.3). String
đối tượng có giá trị không đổi. Chuỗi literals-hay, tổng quát hơn, chuỗi đó là những giá trị của hằng số biểu (§15.28) -Bạn "thực tập nội trú" để chia sẻ độc đáo trường hợp, sử dụng phương pháp String.intern
.
Vì vậy, String str = "abc";
chắc chắn không được chuyển đổi thành String str = new String("abc");
hoàn toàn không tương đương như tôi đã đọc trong một số nhận xét và câu trả lời. Chạy lớp sau:
public class Test {
public static void main(String[] args) {
String one = "abc";
String two = "abc";
String abc = new String("abc");
System.out.println(one == two);
System.out.println(one == abc);
}
}
Tạo đầu ra dưới đây:
true
false
Và chứng tỏ rằng one
và two
được tham chiếu đến các trường hợp tương tự nhưng mà abc
là một tham chiếu đến khác dụ (ví dụ một thêm đối tượng không cần thiết đã được tạo).
Trên thực tế, sử dụng new String(String)
là một cách hiệu quả để xây dựng chuỗi mới và chỉ nên được sử dụng để buộc một chuỗi sao chép vào một mảng ký tự cơ bản mới, như trong
String tiny = new String(monster.substring(10,20))
Nguồn
2009-12-24 08:24:32
Ví dụ chuỗi là thú vị, tôi tự hỏi nếu đó là ngôn ngữ ngữ nghĩa đường được thực hiện trong nền, chuyển đổi chuỗi str = "abc"; thành String str = new String ("abc"); – GrayWizardx
GrayWizardx: Không. Bạn sẽ luôn nhận được chính xác cùng một đối tượng 'String' từ cùng một chuỗi ký tự (ngay cả khi chữ xuất hiện trong các tệp nguồn khác nhau). –
Vâng nhưng. Tom đúng là bạn sẽ nhận được một đối tượng 'String' giống nhau, nhưng đó là hành vi cụ thể cho lớp String, và nó chỉ có thể bởi vì Strings không thay đổi được. Một ví dụ khác là 'int [] arr = {10, 20, 30};'. Tại chỗ mới. Nhưng thực sự là một, cú pháp khởi tạo chỉ là cú pháp để bạn không phải viết nó. –