11. 정적 메서드 내에서 비정적 메서드를 호출할 수 있나요?
아니요. 비정적 메서드는 개체와 연결되므로 개체에 대한 메서드 호출을 수행하기 전에 개체를 만들어야 합니다. 정적 메서드를 호출할 때는 개체를 만들 필요가 없으며 직접 호출할 수 있습니다. (추천 연구: java 인터뷰 질문)
즉, 정적 메서드가 호출될 때 인스턴스 개체가 생성되지 않았을 수 있습니다. 비정적 메서드를 호출하는 경우 해당 비정적 메서드와 연결된 개체는 무엇입니까? 이 논리는 설정할 수 없으므로 정적 메서드는 내부적으로 비정적 메서드를 호출합니다.
12. 정수와 정수의 차이점
int는 Java에서 제공하는 8가지 기본 데이터 유형 중 하나입니다. Java는 각 기본 유형에 대한 래퍼 클래스를 제공합니다. Integer는 int에 대해 Java에서 제공하는 래퍼 클래스입니다. int의 기본값은 0이고 Integer의 기본값은 null입니다. 즉 Integer는 할당되지 않은 값과 값 0의 차이를 구분할 수 있지만 int는 할당되지 않은 값의 상황을 표현할 수 없습니다.
예: 시험에 응시하지 않은 것과 시험 점수가 0점인 것의 차이를 표현하려면 정수만 사용할 수 있습니다. JSP 개발에서는 Integer의 기본값이 null이므로 el 표현식을 사용하여 텍스트 상자에 표시하면 값은 빈 문자열이고 int의 기본값은 0이므로 el 표현식을 사용하면 텍스트 상자에 표시하려면 결과가 0이므로 int는 웹 레이어의 양식 데이터 유형으로 적합하지 않습니다.
Hibernate에서 OID가 Integer 유형으로 정의된 경우 Hibernate는 해당 객체의 값이 null인지 여부에 따라 객체가 임시인지 여부를 결정할 수 있습니다. OID가 int 유형으로 정의되면 이를 설정해야 합니다. hbm 매핑 파일에서 저장되지 않은 값 속성을 0으로 설정합니다.
또한 Integer는 문자열을 정수로 변환하는 등 다양한 정수 관련 연산 방법을 제공합니다. Integer는 정수의 최대값과 최소값을 나타내는 상수도 정의합니다.
13. Math.round(11.5)는 무엇인가요?
Math는 무엇인가요? 클래스 제공 반올림과 관련된 메소드에는 ceil, Floor, round 세 가지가 있습니다. 이들 메소드의 기능은 영어 이름의 의미에 해당합니다.
예를 들어 ceil의 영어 의미는 천장이며 이 방법은 반올림을 의미하며 Math.ceil(11.3)의 결과는 12이고 Math.ceil(-11.3)의 결과는 다음과 같습니다. -11;# 🎜🎜#
floor의 영어 의미는 바닥입니다. 이 방법은 Math.ceil(11.6)의 결과는 11이고 Math.ceil(-11.6)의 결과는 -입니다. 12; #🎜🎜 #가장 어려운 것은 "반올림"을 의미하는 라운드 방법입니다. 알고리즘은 Math.floor(x+0.5)입니다. 이는 원래 숫자에 0.5를 더한 다음 반올림하는 것을 의미합니다. 따라서 Math.round(11.5의 결과)는 12이고 Math.round(-11.5)의 결과는 -11입니다.
14. 오버로드와 오버라이드의 차이점은 무엇인가요? Overloaded 메소드는 반환 값의 유형을 변경할 수 있나요?Overload는 오버로드를 의미하고 Override는 덮어쓰기, 즉 다시 쓰기를 의미합니다.
오버로드는 동일한 클래스에 동일한 이름을 가진 여러 메서드가 있을 수 있지만 이러한 메서드의 매개변수 목록이 다르다는 것을 의미합니다(즉, 매개변수의 수나 유형이 다릅니다).
Overriding은 하위 클래스의 메소드가 상위 클래스의 메소드와 동일한 이름 및 매개변수를 가질 수 있음을 의미합니다. 이 메소드가 하위 클래스에서 생성된 인스턴스 객체를 통해 호출되면 하위 클래스의 메소드가 호출됩니다. 정의 메소드는 상위 클래스에 정의된 동일한 메소드를 덮어쓰는 것과 동일합니다. 이는 또한 객체 지향 프로그래밍의 다형성을 나타냅니다.
하위 클래스가 상위 클래스의 메서드를 재정의하는 경우 상위 클래스보다 적은 수의 예외만 발생시키거나 상위 클래스에서 발생한 예외의 하위 예외를 발생시킬 수 있습니다. 부모 클래스의 문제 일부 문제는 부모 클래스보다 더 많은 문제를 가질 수 없습니다.
하위 클래스 메서드의 액세스 권한은 상위 클래스의 액세스 권한보다 클 수 있습니다. 상위 클래스의 메서드가 비공개 유형인 경우 하위 클래스에 재정의 제한이 없습니다. 이는 하위 클래스에 새로운 메서드를 추가하는 것과 같습니다.
Overloaded 메서드가 반환 값의 유형을 변경할 수 있는지 여부에 대한 질문은 무엇을 묻고 싶은지에 따라 다릅니다.이 질문은 매우 모호합니다. 여러 Overloaded 메서드의 매개 변수 목록이 다른 경우 반환 유형도 다를 수 있습니다.
하지만 당신이 묻고 싶은 질문은: 두 메소드의 매개변수 목록이 완전히 동일한 경우, 오버로드를 달성하기 위해 반환 값이 다를 수 있는지입니다.
이 문제를 설명하기 위해 모순에 의한 증명을 사용할 수는 없습니다. 때로는 메서드를 호출할 때 반환 결과 변수를 정의할 필요가 없기 때문입니다. 반환 결과에 대해.
예를 들어 map.remove(key) 메소드를 호출할 때, Remove 메소드에는 반환값이 있지만, 이때 반환값을 받을 변수를 정의하지 않는 경우가 많습니다. 이름과 매개변수 목록이 완전히 동일하지만 반환 유형이 다른 메서드의 경우 클래스에 두 개의 변수가 있다는 점. Java는 반환 결과 유형으로 결정할 수 없기 때문에 프로그래머가 호출하려는 메서드를 결정할 수 없습니다.
Override는 문자 그대로 재정의로 번역될 수 있으며, 메서드를 다루고 이를 다시 작성하여 다양한 기능을 수행합니다.
우리에게 가장 친숙한 적용 범위는 인터페이스 메서드 구현입니다. 일반적으로 인터페이스에는 메서드만 선언되며, 이를 구현할 때는 인터페이스에서 선언한 모든 메서드를 구현해야 합니다. 이러한 일반적인 사용법 외에도 상속 중에 하위 클래스의 상위 클래스에 있는 메서드를 재정의할 수도 있습니다. 재정의 시 다음 사항에 주의하세요.
1. 재정의된 메서드의 플래그는 재정의된 메서드의 플래그와 완전히 일치해야 합니다.
2. 재정의된 메서드. 메서드의 반환은 일관성이 있습니다.
3. 재정의된 메서드에서 발생하는 예외는 재정의된 메서드 또는 해당 하위 클래스에서 발생하는 예외와 일치해야 합니다.
4. 그렇지 않으면 하위 클래스에 새 메서드만 정의되고 재정의되지 않습니다.
오버로드는 우리에게 친숙할 수 있으며 오버로딩으로 번역될 수 있습니다. 이는 동일한 이름을 가진 일부 메서드를 정의하고 다른 입력 매개 변수를 정의하여 이러한 메서드를 구별할 수 있음을 의미합니다. 그런 다음 다시 호출할 때 VM은 매개 변수 스타일을 선택합니다. 실행하기에 적합한 방법. 오버로딩을 사용할 때는 다음 사항에 주의하세요.
1. 오버로딩을 사용할 때는 다른 매개변수 스타일만 사용할 수 있습니다. 예를 들어, 다양한 매개변수 유형, 다양한 매개변수 수, 다양한 매개변수 순서(물론 동일한 메소드의 여러 매개변수 유형은 달라야 합니다. 예를 들어 fun(int, float)일 수 있지만 fun(int)일 수는 없습니다. , int ));
2. 액세스 권한, 반환 유형 및 예외 발생을 통해 오버로드를 수행할 수 없습니다.
3. 상속의 경우 메소드의 경우에는 영향을 미치지 않습니다. 상위 클래스에서 권한 있는 액세스가 있으면 하위 클래스에서 오버로드할 수 없습니다. 정의된 경우 새 메서드만 정의하고 오버로드 효과를 얻을 수 없습니다.
15. 인터페이스가 인터페이스를 상속받을 수 있나요? 추상 클래스가 구체적인 클래스를 상속받을 수 있나요?인터페이스는 인터페이스를 상속할 수 있습니다. 추상 클래스는 인터페이스를 구현할 수 있고, 추상 클래스는 구체적 클래스를 상속할 수 있습니다. 추상 클래스에는 정적 기본 메서드가 있을 수 있습니다.
참고: 인터페이스와 추상 클래스의 특성과 기능을 이해한다면 이러한 질문에 쉽게 답할 수 있습니다. 만약 당신이 Java 언어의 디자이너라면 그러한 지원을 제공하시겠습니까? 이유가 뭐죠? 제공하지 않을 이유가 없다면 대답은 '예'입니다.
추상 클래스와 일반 클래스의 유일한 차이점은 인스턴스 객체를 만들 수 없고 추상 메서드가 허용된다는 점만 기억하세요.
16. Java에서 다형성을 구현하는 메커니즘은 무엇입니까?부모 클래스나 인터페이스에서 정의한 참조 변수가 하위 클래스나 특정 구현 클래스의 인스턴스 개체를 가리킬 수 있고 프로그램에서 호출한 메서드가 런타임에 동적으로 바인딩된다는 사실에 의존합니다. 참조 변수가 가리키는 특정 인스턴스 객체, 즉 참조 변수의 유형에 정의된 메소드가 아닌 메모리에서 실행되는 객체의 메소드입니다.
17. 추상 클래스와 인터페이스의 구문 차이점은 무엇입니까?1. 추상 클래스는 생성자를 가질 수 있지만 인터페이스는 생성자를 가질 수 없습니다.
2. 추상 클래스에는 일반 멤버 변수가 있을 수 있지만 인터페이스에는 일반 멤버 변수가 없습니다.
3. 추상 클래스에는 추상이 아닌 일반 메서드가 포함될 수 있습니다. 일반적인 방법이 될 수 없습니다.
4. 추상 클래스의 추상 메서드 액세스 유형은 public, protected 및(기본 유형, eclipse에서는 오류가 보고되지 않지만 작동하지 않아야 함) 가능하지만 인터페이스의 추상 메서드는 public 유형만 가능합니다. 그리고 기본값은 공개 추상 유형입니다.
5. 추상 클래스는 정적 메서드를 포함할 수 있지만 인터페이스는 정적 메서드를 포함할 수 없습니다.
6. 추상 클래스와 인터페이스 모두 정적 멤버 변수를 포함할 수 있지만 인터페이스에서는 정의된 변수는 publicstatic 최종 유형만 가능하며 기본값은 publicstatic 최종 유형입니다.
7. 클래스는 여러 인터페이스를 구현할 수 있지만 추상 클래스는 하나만 상속할 수 있습니다.
18. 추상 메서드는 정적, 네이티브 및 동기화를 동시에 수행할 수 있나요?추상 메서드는 하위 클래스에 의해 구현되어야 하고 정적 메서드는 하위 클래스와 관련이 없기 때문에 정적일 수 없습니다!
네이티브 메소드는 메소드가 다른 플랫폼 종속 프로그래밍 언어로 구현된다는 의미이므로 서브클래스로 구현하는 데 문제가 없으며 추상과 혼합될 수 없습니다.
예를 들어 FileOutputSteam 클래스는 하드웨어를 처리해야 하며 기본 구현은 운영 체제와 관련된 API 구현을 사용합니다. 예를 들어 Windows에서는 C 언어로 구현됩니다. FileOutputStream의 open 메소드는 다음과 같이 정의되어 있습니다.
private native void open(Stringname) throwsFileNotFoundException;
다른 사람이 작성한 C 언어 함수를 Java를 사용하여 호출하려면 Java 요구 사항에 따라 C 언어 함수를 작성해야 하며, 그러면 우리 C 언어 함수가 다른 사람의 C 언어를 호출합니다. 기능.
우리의 C 언어 함수는 Java의 요구 사항에 따라 작성되었으므로 Java 측의 도킹 방법은 우리의 C 언어 함수에 해당하는 메서드를 정의하는 것입니다. 특정 코드를 작성할 필요는 없지만 앞에 네이티브로 선언해야 합니다.
동기화와 추상을 함께 사용하는 문제에 대해서는 불가능하다고 생각합니다. 왜냐하면 수년간의 연구와 개발 동안 이런 상황을 본 적이 없으며 동기화는 특정 방법으로 사용해야 한다고 생각하기 때문입니다. .
게다가 메소드의 동기화 동기화에서 사용하는 동기화 잠금 개체는 이것이며, 추상 메소드에서는 이것이 무엇인지 판별하는 것이 불가능합니다.
19. 내부 클래스는 해당 클래스의 멤버를 참조할 수 있나요? 제한사항이 있나요?
물론이죠. 정적 내부 클래스가 아니면 제한이 없습니다!
정적 중첩 클래스를 내부 클래스의 특별한 경우로 간주하면 이 경우 외부 클래스의 일반 멤버 변수에 액세스할 수 없고 외부 클래스의 정적 멤버에만 액세스할 수 있습니다. 다음 코드 :
class Outer { static int x; static class Inner { voidtest(){ syso(x); } } }
20.String s = "Hello"; s = s + "world!"; 이 두 줄의 코드가 실행된 후 원본 String 객체의 내용이 변경되었습니까?
아니요. String은 불변 클래스로 설계되었기 때문에 해당 객체는 모두 불변 객체입니다.
이 코드에서 s는 원래 "Hello"라는 내용이 포함된 String 객체를 가리킨 다음 s에서 + 연산을 수행했습니다. s가 가리키는 객체가 변경되었나요? 대답은 '아니요'입니다.
이제 s는 더 이상 원본 개체를 가리키지 않고 "Hello world!"라는 내용이 포함된 다른 String 개체를 가리킵니다. 원본 개체는 여전히 메모리에 존재하지만 참조 변수 s는 더 이상 이를 가리키지 않습니다.
위의 설명을 통해 우리는 쉽게 또 다른 결론을 도출할 수 있습니다. 문자열에 다양한 수정이 자주 발생하거나 예상치 못한 수정이 발생하는 경우 문자열을 사용하여 문자열을 표현하면 많은 메모리 오버헤드가 발생하게 됩니다.
String 개체는 생성된 후에는 변경할 수 없기 때문에 각각의 다른 문자열을 표현하려면 String 개체가 필요합니다. 이때는 각각의 문자열에 대해 새 개체를 생성하는 대신 수정이 가능한 StringBuffer 클래스를 사용하는 것이 좋습니다. 게다가 이 두 가지 유형의 객체를 변환하는 것은 매우 쉽습니다.
동시에 동일한 내용의 문자열을 사용하려면 매번 새 문자열을 만들 필요가 없다는 것도 알 수 있습니다. 예를 들어 생성자에서 s라는 문자열 참조 변수를 초기화하고 이를 초기 값으로 설정하려면 다음과 같이 해야 합니다.
public class Demo { private String s; ... public Demo { s = "Initial Value"; } ... }
s = new String("Initial Value");
후자는 매번 생성자를 호출하여 다음을 생성합니다. 새로운 객체는 성능이 낮고 메모리 오버헤드가 크며 의미가 없습니다. 왜냐하면 String 객체는 변경할 수 없기 때문입니다. 따라서 동일한 내용을 가진 문자열의 경우 이를 표현하는 데 하나의 String 객체만 필요합니다.
즉, 위의 생성자를 여러 번 호출하여 여러 객체를 생성하는 경우 해당 문자열 유형 속성은 모두 동일한 객체를 가리킵니다.
위의 결론은 문자열 상수의 경우 내용이 동일하면 Java가 이를 동일한 String 객체를 나타내는 것으로 간주한다는 사실에 근거합니다. new 키워드를 사용하여 생성자를 호출하면 내용이 동일한지 여부에 관계없이 항상 새 객체가 생성됩니다.
String 클래스를 불변 클래스로 설계해야 하는 이유는 그 목적에 따라 결정됩니다. 실제로 String뿐만 아니라 Java 표준 클래스 라이브러리의 많은 클래스도 불변입니다.
시스템을 개발할 때 때때로 관련 값 집합을 전달하기 위해 불변 클래스를 설계해야 하는 경우가 있는데, 이는 객체 지향 사고의 표현이기도 합니다.
불변 클래스에는 몇 가지 장점이 있습니다. 예를 들어 객체가 읽기 전용이므로 여러 스레드의 동시 액세스에 문제가 없습니다. 물론 몇 가지 단점도 있습니다. 예를 들어, 각각의 서로 다른 상태에는 이를 표현하기 위한 객체가 필요하므로 성능 문제가 발생할 수 있습니다. 따라서 Java 표준 클래스 라이브러리에서는 StringBuffer라는 변수 버전도 제공합니다.
위 내용은 기본 Java 면접 질문 (2)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!