2017-08-05 67 views
5

usiłuję zrozumieć wdrażania Integer .ToString(), która wygląda tak:Gdzie jest zdefiniowany konstruktor String (int, int, char [])?

public static String toString(int i) { 
    if (i == Integer.MIN_VALUE) 
     return "-2147483648"; 
    int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i); 
    char[] buf = new char[size]; 
    getChars(i, size, buf); 
    return new String(0, size, buf); 
} 

I wpadłem na ostatniej linii, która nie wygląda jak każdy z konstruktorów w klasie String oprócz tego:

String(char value[], int offset, int count) 

... oprócz tego, że ta funkcja jest wywoływana z char [] argumentu pierwsze, w przeciwieństwie do, jak to jest stosowane w Integer.toString(). Miałem wrażenie, że zmiana kolejności argumentów jest liczona jako zmiana w podpisie metody i może być innym nadpisaniem metody.

Dlaczego to działa, czy interpretuję to nieprawidłowo?

+1

Spójrz na realizację String. Prawdopodobnie ma jakieś prywatne pakiety, które nie pojawią się w publicznym javadoc. –

+0

Ale (1+) do sprawdzania API i zadawania przemyślanego pytania. –

+0

Gdzie widzisz rzekomy kod? To nie jest [w Javie 8] (http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/9d617cfd6717/src/share/classes/java/lang/Integer.java#l397). – Boann

Odpowiedz

10

Używa to konstruktora prywatnego, paczkowego String. Nie pojawia się w Javadoc String, ponieważ jest pakietem prywatnym.

Jeśli zaznaczysz String source code w tym samym miejscu, zobaczysz

644  // Package private constructor which shares value array for speed. 
    645  String(int offset, int count, char value[]) { 
    646   this.value = value; 
    647   this.offset = offset; 
    648   this.count = count; 
    649  }