Java 해혹 2-12ABC

2447 단어
이 수수께끼는 듣기 좋은 질문입니다. 다음 프로그램은 무엇을 인쇄합니까?
이 프로그램이 ABC easy as 123을 출력하기를 원하실 수도 있습니다.유감스럽게도 그것은 없다.실행하면 ABC easy as와 같이 인쇄되어 있음을 알 수 있습니다 [C@16f0472뭐 그런 거.왜 이 출력이 이렇게 추할까요?
비록char는 정수 형식이지만, 많은 클래스 라이브러리에서 이를 특수 처리합니다. 왜냐하면char 수치는 보통 정수가 아니라 문자를 표시하기 때문입니다.예를 들어,char 수치를 println에 전달하는 방법은 숫자 코드가 아닌 유니코드 문자를 출력합니다.문자 그룹이 같은 특수 처리를 받았습니다: println의char[] 리셋 버전은 그룹에 포함된 모든 문자를 출력하고 String을 출력합니다.valueOf 및 StringBuffer.append의char[]버전을 다시 불러오는 행위도 유사합니다.
그러나 문자열 연결 조작부호는 이 방법에서 정의되지 않았다.이 조작부호는 두 개의 조작수에 대해 문자열 변환을 먼저 실행한 다음에 발생하는 두 문자열을 연결시키는 것으로 정의됩니다.배열을 포함한 객체에서 참조하는 문자열 변환에 대한 정의는 다음과 같습니다[JLS 15.18.1.1].
null로 인용하면 문자열'null '으로 변환됩니다.그렇지 않으면, 이 변환의 실행은 인용 대상의 toString 방법을 매개 변수로 호출하지 않는 것과 같다.그러나 toString 방법을 호출한 결과가null이면 문자열'null'로 대체합니다.
그렇다면 비공식 카드 그룹 위에서 토스트링 방법을 사용하면 어떤 행동이 일어날까요?배열은 Object에서 계승된 toString 방법[JLS 10.7]이다. 규범에 따르면'문자열을 되돌려줍니다. 이 문자열은 대상이 속한 클래스의 이름,'@'기호, 그리고 대상의 산열 코드를 나타내는 무기호 16진수 정수'를 포함합니다[Java-apI].Class 관련getName의 규범은 다음과 같습니다:char[] 형식의 클래스 대상에서 이 방법을 호출한 결과는 문자열 '[C' 입니다. 이 문자열을 연결하면 프로그램에서 출력된 추악한 문자열이 됩니다.
이 프로그램을 정정할 수 있는 두 가지 방법이 있다.문자열 연결 작업을 호출하기 전에 하나의 그룹을 하나의 문자열로 현저하게 변환할 수 있습니다.
public class ABC{
    public static void main(String[] args){
        String letters = "ABC";
        char[] numbers = {'1', '2', '3'};
        System.out.println(letters + " easy as " + numbers);
    }
}

아니면, 당신은 시스템을.out.println 호출은 두 개의 호출로 분해되어 println의char[]를 이용하여 버전을 다시 불러옵니다:
System.out.println(letters + " easy as " +
                       String.valueOf(numbers));

이 정정은valueOf와 println 방법으로 올바른 리셋 버전을 호출한 경우에만 정상적으로 실행될 수 있음을 주의하십시오.다시 말하면, 그들은 수조가 인용하는 컴파일러 유형에 엄격하게 의존한다.
다음 절차는 이러한 의존성을 설명한다.이것은 묘사한 두 번째 정정 방식의 구체적인 실현처럼 보이지만, 출력은 최초의 프로그램에서 나온 출력과 같이 추합니다. 왜냐하면 println의 Object 리셋 버전을 호출했기 때문에char[] 리셋 버전이 아닙니다.
System.out.print(letters + " easy as ");
System.out.println(numbers);

한 마디로 하면char수 그룹은 문자열이 아닙니다.char 배열을 문자열로 변환하려면 String을 호출합니다.valueOf(char[] 메서드.일부 라이브러리의 방법은char 그룹의 유사한 문자열에 대한 지원을 제공합니다. 보통 Object 버전의 리셋 방법과char[] 버전의 리셋 방법을 제공합니다. 그 후에야 후자가 우리가 원하는 행동을 할 수 있습니다.
언어 디자이너에 대한 교훈은char[] 형식은 토스트링 방법을 덮어써서 그룹에 포함된 문자를 되돌려야 한다는 것이다.더 일반적으로 말하면, 그룹 형식은 그룹 내용의 문자열 표시를 되돌려 주는 toString 방법을 덮어써야 할 수도 있다.

좋은 웹페이지 즐겨찾기