Java 까다로운 인터뷰 질문


예전에 자바 프로그래밍 질문 50가지에 대한 기사를 쓴 적이 있습니다. 우리 독자들은 그것을 많이 좋아했습니다. 그래서 오늘 우리는 Java에서 까다로운 인터뷰 질문을 살펴볼 것입니다.

Java 까다로운 인터뷰 질문

이것들은 프로그래밍 질문이지만 Java에 대한 깊은 이해가 없다면 출력을 추측하고 설명하기 어려울 것입니다.

1. 인수로 Null

오버로드된 함수가 있고 null을 전달하고 있습니다. 어떤 함수가 호출되고 프로그램의 출력은 무엇입니까?

public class Test {
	public static void main(String[] args) {
		foo(null);
	}
	public static void foo(Object o) {
		System.out.println("Object argument");
	}
	public static void foo(String s) {
		System.out.println("String argument");
	}
}

2. “L”을 길게 사용

아래 진술의 결과를 짐작할 수 있습니까?

long longWithL = 1000*60*60*24*365L;
long longWithoutL = 1000*60*60*24*365;
System.out.println(longWithL);
System.out.println(longWithoutL);

Null 인수 까다로운 질문에 대한 설명

Java 사양에 따르면 오버로드의 경우 컴파일러는 가장 구체적인 기능을 선택합니다. 분명히 String 클래스는 Object 클래스보다 더 구체적이기 때문에 "String argument\를 출력할 것입니다. 하지만 아래와 같이 클래스에 다른 메소드가 있다면 어떨까요?

public static void foo(StringBuffer i){
	System.out.println("StringBuffer impl");
}

이 경우 Java 컴파일러는 \The method foo(String) is ambiguous for the type Test라는 오류를 발생시킵니다. String 및 StringBuffer에는 상속 계층 구조가 없습니다. 첫 번째 메소드에 의해 처리된 호출이 컴파일 시간 유형 오류 없이 다른 호출에 전달될 수 있는 경우 다른 것보다 특정합니다. String을 매개변수로 Object 인수와 String 인수에 전달할 수 있지만 StringBuffer 인수 메소드에는 전달할 수 없습니다.

긴 변수에 대한 설명

코드 조각의 출력은 다음과 같습니다.

31536000000
1471228928

"L” 접미사를 추가하여 명시적으로 첫 번째 변수를 long으로 생성합니다. 따라서 컴파일러는 이를 long으로 처리하고 첫 번째 변수에 할당합니다. 두 번째 명령문의 경우 컴파일러는 계산을 수행하고 이를 a로 처리합니다. 32비트 정수. 출력이 정수 최대 값(2147483647) 범위를 벗어나므로 컴파일러는 최상위 비트를 잘라 변수에 할당합니다. 1000*60*60*24*365L = 011101010111101100010010110000000000에 해당하는 이진수 (36비트). 32비트 int에 수용하기 위해 4개의 최상위 비트를 제거한 후 새 값 = 01010111101100010010110000000000(32비트)입니다. 이것은 1471228928과 같으므로 출력입니다. 최근에 Java Trick에 대한 YouTube 비디오 시리즈를 만들었습니다. 프로그램들.

GitHub 리포지토리에서 더 많은 Java 예제 프로그램을 확인할 수 있습니다.