2011-10-28 17 views
8

Wyjście z następującego kodu jest 123 ponieważ substring trwa od beginIndex do endIndex - 1. Jestem jednak zaskoczony, jak char tutaj rozumiana jest jako 3 (Int), ponieważ substring wziąć dwa ints . Jaka jest tego koncepcja?Przechodząc char do metody z parametrem int

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

Odpowiedz

12

To idzie przez całą drogę powrotną do C, gdzie char jest w istocie wąski typ całkowity i dostaje niejawnie konwertowane do int gdy jest to konieczne.

W języku Java jest to technicznie zwane "rozszerzającą się prymitywną konwersją" i jest objęte section 5.1.2 of the JLS.

+0

+1 ..Sprowadza się to do tego, aby nie myśleć o "char" jako literze lub postaci, ale zamiast tego jako danych, które komputer jest w stanie odwzorować na literę lub postać. Następnie, aby ułatwić ten proces, stworzyliśmy kilka skrótów pozwalających nam bezpośrednio przypisać litery lub znaki do 'char's (jak' char c = 'x'; 'oznacza po prostu" Fragment danych reprezentowany przez zmienną c jest wartość odwzorowująca na znak "x". "Zmienna" c "nie jest literą więcej niż jakikolwiek inny element danych w systemie.) – corsiKa

0

dlatego deklaracja funkcji substring wygląda jak podłańcuch (int startIndex, int endIndex). Teraz po przejściu char jest automatycznie promowane do liczby całkowitej (endIndex), a zatem traktowane jako int.

0

Zobacz dział 5.1.2, w którym omówiono poszerzające się konwersje.

0

Jest to tak zwany niejawny casting. To samo ma miejsce, jeśli przypisujesz wartość int do podwójnej. Krótki przykład

double d = 1; 

1 jest int ale jest niejawnie rzutować na double (1,0).

3

Inni już wyjaśnili, dlaczego to działa, ale zauważ, że niewłaściwą praktyką jest używanie zmiennych char dla indeksów, ponieważ mają one różną powiązaną semantykę, a zatem używanie charu jako indeksu jest mylące.

Używaj znaków tylko do przechowywania danych postaci i prawdopodobnie lepiej: staraj się całkowicie unikać znaków, ponieważ nie są one wystarczająco szerokie, aby pomieścić każdy znak (zobacz Unicode i dyskusję w kodzie). Użyj int do przechowywania punktów kodu znaków zamiast.

0

W char a = 3;, można pomyśleć o tym, jak przechowywać 0011, wartość binarną o 3. char „3” jest w rzeczywistości nie są przechowywane: Jeśli wypróbowane traktując to znak, że nie dostanie 3. Ale jeśli nie

char a = '3';

Teraz jesteś przechowywania char 3, wartość ASCII 51, a jeśli próbował go jak w int, co można uzyskać 51.

0

Technicznie ponieważ char jest podtypem int.

Aby ustalić, czy substring(int,int) dotyczy argumentu (int,char), najpierw spróbuj 15.12.2.2 Phase 1: Identify Matching Arity Methods Applicable by Subtyping, musimy sprawdzić, czy char jest podtypem int. Per 4.10.1 Subtyping among Primitive Types, to jest.

Następnie, aby przypisać char argument parametru int, za 15.12.4.5 Create Frame, Synchronize, Transfer Control stosujemy 5.3 Method Invocation Conversion, która zamienia char do int Per 5.1.2 Widening Primitive Conversion