2011-10-28 31 views
8

Kết quả của đoạn mã sau là 123substring mất từ ​​beginIndex để endIndex - 1. Tuy nhiên, tôi ngạc nhiên như thế nào char đây được hiểu là 3 (int) vì substring mất hai ints . Khái niệm đằng sau điều này là gì?Đi qua char thành một phương pháp với một tham số int

String x = "12345"; 
char a = 3; 
x = x.substring(0, a); 
System.out.println(x); 

Trả lời

12

này đi tất cả các cách trở lại C, nơi char là trong bản chất một loại nguyên hẹp và được ngầm chuyển đổi sang int bất cứ khi nào cần thiết.

Trong Java, điều này về mặt kỹ thuật được gọi là "chuyển đổi nguyên thủy mở rộng" và được bao gồm trong section 5.1.2 of the JLS.

+0

1 ..Nó sẽ không suy nghĩ về một 'char' như một ký tự hoặc ký tự, mà thay vào đó là một phần dữ liệu mà máy tính có thể ánh xạ tới một ký tự hoặc ký tự. Sau đó, để tạo thuận lợi cho quá trình này, chúng tôi đã thực hiện một số phím tắt để cho phép chúng tôi gán trực tiếp chữ cái hoặc ký tự cho 'char' (như 'char c = 'x';' chỉ có nghĩa là "Một phần dữ liệu được biểu diễn bằng biến c là giá trị ánh xạ tới ký tự 'x'. 'Biến' c 'không còn là chữ cái nào so với bất kỳ phần dữ liệu nào khác trong hệ thống.) – corsiKa

0

để khai báo chức năng của chuỗi con giống như chuỗi con (int startIndex, int endIndex). Bây giờ khi bạn vượt qua char nó được tự động thăng lên số nguyên (endIndex) và do đó được coi là int.

0

Hãy xem phần 5.1.2, nơi nó thảo luận về việc mở rộng chuyển đổi.

0

Điều này được gọi là truyền ngầm. Điều tương tự cũng xảy ra nếu bạn chỉ định giá trị int cho giá trị gấp đôi. dụ nhanh

double d = 1; 

1 là một int nhưng nó được ngầm đúc để double (1.0).

3

Những người khác đã phát hiện lý do tại sao nó hoạt động nhưng lưu ý rằng việc sử dụng biến char cho các chỉ mục là xấu, vì chúng có ngữ nghĩa liên quan khác nhau và do đó rất khó sử dụng char làm chỉ mục.

Chỉ sử dụng ký tự để lưu trữ dữ liệu ký tự và có thể tốt hơn: cố gắng tránh toàn bộ, vì chúng không đủ rộng để lưu trữ mọi ký tự (xem Unicode và thảo luận điểm mã). Sử dụng int để lưu trữ các điểm mã ký tự thay thế.

0

Trong char a = 3;, bạn có thể nghĩ về việc lưu trữ 0011, giá trị nhị phân của 3. char '3' không thực sự được lưu trữ: Nếu bạn thử xử lý là char, bạn sẽ không nhận được 3. Nhưng nếu bạn đã làm

char a = '3';

Bây giờ bạn đang lưu trữ các char 3, một giá trị ascii là 51, và nếu bạn cố gắng sử dụng nó như trong int, bạn sẽ nhận được 51.

0

Về mặt kỹ thuật, đây là vì char là một loại phụ của int.

Để xác định xem substring(int,int) được áp dụng cho lập luận (int,char), đầu tiên chúng tôi cố gắng 15.12.2.2 Phase 1: Identify Matching Arity Methods Applicable by Subtyping, chúng ta cần phải kiểm tra xem char là một subtype của int. Per 4.10.1 Subtyping among Primitive Types, đúng vậy.

Sau đó, để gán đối số char tới tham số int, mỗi 15.12.4.5 Create Frame, Synchronize, Transfer Control, chúng tôi áp dụng 5.3 Method Invocation Conversion, chuyển đổi char để int, mỗi 5.1.2 Widening Primitive Conversion

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