2012-10-03 60 views
6

Nếu nó có thể được bắt đầu chỉ vớiTại sao String là một lớp học?

String s = "Hello"; 

thì tại sao nó là một lớp học? Các thông số ở đâu?

+1

Câu hỏi của bạn đã có đủ câu trả lời hay, chỉ cần lưu ý rằng bạn cũng có thể làm: Integer i = 5; Dài l = 6L; vv, trong khi Integer chắc chắn là một lớp quá. Đường cú pháp. –

+0

@AssenKolov chúng hoàn toàn khác nhau về cách chúng được triển khai –

+0

@AssenKolov Vì vậy, về cơ bản, ảo thuật JVM? Không bao giờ biết điều đó, cảm ơn – Luke

Trả lời

10

Cho rằng String được một lớp học hữu ích và thường được sử dụng như vậy, nó có một cú pháp đặc biệt (thông qua một chuỗi đại diện theo nghĩa đen: các văn bản bên "") để tạo trường của nó, nhưng ngữ nghĩa hai là tương đương:

String s = "Hello"; // just syntactic sugar 
String s = new String("Hello"); 

Đằng sau mui xe cả hai hình thức là không 100% tương đương, vì cú pháp sử dụng "" cố gắng sử dụng lại chuỗi từ nhóm chuỗi của Java, trong khi diễn đạt rõ ràng với new String("") sẽ luôn tạo đối tượng mới. Tuy nhiên, không có sai lầm, một trong hai cú pháp sẽ tạo ra một tham chiếu đến một thể hiện đối tượng, các chuỗi không được coi là các kiểu nguyên thủy trong Java và là các cá thể của một lớp, giống như bất kỳ lớp nào khác.

+1

+1 để đề cập đến hồ bơi không đổi – tddmonkey

0

Dòng bạn có trong ví dụ là tạo đối tượng Chuỗi. Không có bất kỳ thông số nào theo nghĩa truyền thống mà bạn đang nghĩ đến.

12
String s = "Hello"; 

chỉ là đường hợp pháp. Nó thực sự được triển khai như một kiểu tham chiếu. (Đây là một loại tài liệu tham khảo không thay đổi, vì vậy bạn không thể thay đổi nó)

7

Từ §4.3.3 of the Java Specification:

literals chuỗi được tham chiếu đến thể hiện của lớp String.

Và từ §3.10.5:

Một chuỗi literal là một tham chiếu đến một thể hiện của lớp String

2
String s = "Hello"; 

JVM đối xử với nó như:

String s = new String("Hello"); và thực tập nó đến String hồ bơi với số String chữ.

+1

Đó là không chính xác về mặt kỹ thuật vì ví dụ của bạn đang tạo hai đối tượng 'Chuỗi'. – LanguagesNamedAfterCofee

+0

@LanguagesNamedAfterCofee: Không chắc chắn ý bạn là gì, bạn có thể cụ thể hơn không, để tôi có thể sửa câu trả lời của mình. – kosa

+1

Đối tượng "Hello" <- 'String' được tạo ||| đối tượng String (...) <- 'String' mới được tạo ra – LanguagesNamedAfterCofee

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