정적 키워드는 코드를 작성하고 읽을 때 많은 친구들이 만나는 키워드입니다. 또한 주요 회사의 면접관이 인터뷰 중에 물어보고 싶어하는 지식 중 하나입니다. 먼저 정적 키워드의 사용과 일반적인 오해에 대해 이야기합시다. 마지막으로, 우리는 서면 인터뷰에서 정적에 대한 일반적인 테스트 질문을 나열합니다. 이 기사의 디렉토리 개요는 다음과 같습니다.
1. 정적 키워드의 목적
2. 정적 키워드의 오해
3. 일반적인 서면 인터뷰 질문
잘못된 것이 있다면 비판과 교정을 이해하고 환영하기를 바랍니다.
저자의 노동 성과를 존중하십시오. 재 인쇄시 원래 링크를 표시하십시오.
http://www.cnblogs.com/dolphin0520/p/3799052.html
1. 정적 키워드의 목적
"정적 메소드는 이것이없는 방법입니다. 정적 메소드가 정적 메소드 내부에서 호출 될 수 없으며, 이는 정적 메소드가 가능합니다. 그리고 정적 메소드는 객체를 만들지 않고 클래스 자체를 통해서만 호출 될 수 있습니다. 이것은 실제로 정적 방법의 주요 목적입니다."
이 구절은 정적 메소드의 특수 특징만을 보여 주지만 정적 키워드의 기본 기능임을 알 수 있습니다. 요컨대, 그것은 한 문장으로 설명됩니다.
객체를 만들지 않고 호출하는 것이 편리합니다.
분명히 정적 키워드로 수정 된 메소드 또는 변수는 액세스를 위해 객체에 의존 할 필요가 없습니다. 클래스가로드되는 한 클래스 이름을 통해 액세스 할 수 있습니다.
정적은 클래스 멤버 메소드 및 클래스 멤버 변수를 수정하는 데 사용할 수 있습니다. 또한 프로그램 성능을 최적화하기 위해 정적 코드 블록을 작성할 수 있습니다.
1) 정적 방법
정적 방법을 일반적으로 정적 방법이라고합니다. 객체에 의존하지 않고 정적 메소드에 액세스 할 수 있으므로 객체에 의존하지 않기 때문에 정적 메소드에는이 방법이 없습니다. 물체가 없기 때문에 이와 같은 것은 없습니다. 이 기능으로 인해 비 정적 멤버 변수와 클래스의 비 정적 멤버 메소드는 정적 메소드에서는 비 정적 멤버 메소드/변수가 호출 할 특정 객체에 의존해야하기 때문에 정적 메소드에서 액세스 할 수 없습니다.
그러나 정적 메소드와 비 정적 멤버 변수는 정적 메소드에서 액세스 할 수는 없지만 정적 부재 메소드에서 정적 멤버 방법/변수에 액세스 할 수 있음을 주목해야합니다. 간단한 예를 들어 봅시다 :
위의 코드에서는 print2 메소드가 객체와 독립적으로 존재하기 때문에 클래스 이름별로 직접 호출 할 수 있습니다. 정적 메소드/변수에 정적 메소드로 액세스 할 수있는 경우 기본 방법에 다음과 같은 설명이있는 경우 다음과 같습니다.
myObject.print2 ();
현재 객체가 없으며 STR2가 전혀 존재하지 않으므로 모순이있을 것입니다. 방법에 대해서도 마찬가지입니다. 비 정적 멤버 변수가 print1 방법으로 액세스되는지 여부를 예측할 수 없으므로 정적 멤버 메소드에서 비 정적 멤버 메소드에 액세스하는 것도 금지됩니다.
비 정적 멤버 방법의 경우 정적 멤버 메소드/변수에 액세스하는 것이 분명히 무제한입니다.
따라서 객체를 만들지 않고 메소드를 호출하려면이 메소드를 정적으로 설정할 수 있습니다. 가장 일반적인 정적 방법이 주요 방법입니다. 기본 방법이 정적 인 이유는 이제 매우 명확합니다. 프로그램은 기본 메소드를 실행할 때 객체를 생성하지 않기 때문에 클래스 이름을 통해서만 액세스 할 수 있습니다.
또한 정적으로 표시되지 않더라도 클래스의 생성자는 실제로 정적 방법입니다.
2) 정적 변수
정적 변수를 정적 변수라고도합니다. 정적 변수와 비 정적 변수의 차이점은 정적 변수가 모든 객체에서 공유되며 메모리에 하나의 사본 만 공유한다는 것입니다. 이는 클래스가 처음으로로드 된 경우에만 초기화됩니다. 비 정적 변수는 객체가 소유하고 객체를 만들 때 초기화됩니다. 여러 사본이 있으며 각 객체가 소유 한 사본은 서로 영향을 미치지 않습니다.
정적 멤버 변수의 초기화 순서는 정의 된 순서로 초기화됩니다.
3) 정적 코드 블록
정적 키워드의 또 다른 키 기능은 프로그램 성능을 최적화하기 위해 정적 코드 블록을 형성하는 것입니다. 정적 블록은 클래스의 어느 곳에도 배치 될 수 있으며 클래스에 여러 정적 블록이있을 수 있습니다. 클래스가 처음로드되면 각 정적 블록은 정적 블록의 순서로 실행되며 한 번만 실행됩니다.
정적 블록을 사용하여 프로그램 성능을 최적화 할 수있는 이유는 특성 때문입니다. 클래스가로드 된 경우에만 한 번만 실행됩니다. 예는 다음과 같습니다.
클래스 사람 {개인 날짜 생년월일; 공개 사람 (날짜 출생) {this.birthdate = birthdate;} boolean isbornboomer () {date startDate = date.valueof ( "1946"); date enddate = date.valueof ( "1964"); returndate.compareto (returndate.compareto) < 0;}} Isbornboomer는이 사람이 1946-1964 년에 태어 났는지 여부에 익숙합니다. isbornboomer가 호출 될 때마다 두 개의 물체가 생성되어 공간 낭비가 발생합니다. 이것으로 변경되면 더 나을 것입니다.
클래스 사람 {개인 날짜 생년월일; 개인 정적 날짜 StartDate, endDate; static {startDate = date.valueof ( "1946"); endDate = date.valueof ( "1964");} 공개 사람 (날짜 생일) {this.birthdate = birthdate;} birthdate isbornboomer () {returndate isbornboomer () {returndate isbornboomer () {returndate isbornboomer () 생일 .compareto (enddate) <0;}} 따라서, 한 번만 수행 해야하는 일부 초기화 작업은 정적 코드 블록에 배치됩니다.
2. 정적 키워드의 오해
1. 정적 키워드가 수업에서 구성원의 액세스 권한을 변경합니까?
일부 초보자는 자바의 정적 키워드 기능과 C/C ++의 정적을 혼동합니다. C/C ++의 정적과 달리 Java의 정적 키워드는 변수 또는 메소드의 범위에 영향을 미치지 않습니다. Java에서 액세스 권한에 영향을 줄 수있는 유일한 키워드는 개인, 공개 및 보호입니다 (패키지 액세스 권한 포함). 이해하려면 다음 예제를보십시오.
신속한 오류 "person.age는 표시되지 않습니다"는 정적 키워드가 변수 및 메소드의 액세스 권한을 변경하지 않음을 의미합니다.
2.이를 통해 정적 멤버 변수에 액세스 할 수 있습니까?
정적 방법에는 이것이 없지만 정적이 아닌 방법으로 정적 멤버 변수에 액세스 할 수 있습니까? 먼저 다음 예를 살펴 보겠습니다. 이 코드 출력의 결과는 무엇입니까?
공개 클래스 메인 {정적 int 값 = 33; public static void main (string [] args)은 예외 {new main (). printValue ();} private void printValue () {int value = 3; system.out.println (this.value);}} 33
이것은 주로 이것과 정적을 이해하는 주요 관찰 팀입니다. 이것은 무엇을 의미합니까? 이것은 현재 객체를 나타냅니다. printValue가 new main ()을 통해 호출되면 현재 객체는 new main ()에 의해 생성 된 객체입니다. 정적 변수는 객체에 의해 즐거워지기 때문에 이것의 값은 의심 할 여지없이 33입니다. printValue 메소드 내부의 값은 로컬 변수이며 전혀 이것과 관련 될 수 없으므로 출력은 33입니다. 여기서 한 가지를 기억하십시오. 정적 멤버 변수는 객체를 통해 액세스 할 수 없다는 것을 의미하지는 않습니다. 모든 정적 방법과 정적 변수는 객체를 통해 액세스 할 수 있습니다 (액세스 권한이 충분한 한).
3. 정적 변수에 정적으로 행동 할 수 있습니까?
C/C ++에서는 STATIC가 로컬 변수를 범위를 범할 수 있지만 Java에서는 기억하십시오. STATIC은 로컬 변수를 수정하는 데 사용될 수 없습니다. 왜 이것이 Java 구문의 제공인지 묻지 마십시오.
3. 일반적인 서면 인터뷰 질문
다음은 서면 인터뷰에서 종종 발생하는 정적 키워드에 대한 몇 가지 질문을 나열합니다. 그들은 참조만을위한 것입니다. 보충제가 있으면 아래 메시지를 남겨주세요.
1. 다음 코드의 출력 결과는 무엇입니까?
공개 클래스 테스트는 기본 {static {systation.out.println ( "test static");} public test () {system.out.println ( "테스트 생성자");} public static void main (string [] args) {new test ();} class {static {systation.println ( "base static"); base () {system.out.println ( "기본 생성자");}} 기본 정적
정적 테스트
기본 생성자
테스트 생성자
이 결과가 왜 그런지에 대해서는 먼저 논의하지 마십시오. 이 코드의 특정 실행 프로세스에 대해 생각해 봅시다. 실행 시작시 기본 메소드는 프로그램 입구이므로 주요 메소드를 먼저 찾아야하지만 기본 메소드를 실행하기 전에 테스트 클래스를 먼저로드해야합니다. 테스트 클래스를로드 할 때 테스트 클래스가 기본 클래스에서 상속되므로 기본 클래스를 먼저로드하게됩니다. 기본 클래스를로드 할 때는 정적 블록이 있음을 발견 한 다음 정적 블록을 실행합니다. 기본 클래스가로드되면 테스트 클래스가 계속로드 된 다음 테스트 클래스에 정적 블록이있어 정적 블록이 실행됩니다. 필요한 클래스를로드 한 후 주요 메소드가 실행되기 시작합니다. 기본 메소드에서 New Test ()를 실행할 때 부모 클래스의 생성자가 먼저 호출 된 다음 자체 생성자로 호출됩니다. 따라서 위의 출력 결과가 나타납니다.
2.이 코드의 출력 결과는 무엇입니까?
공개 클래스 테스트 {person person = new person ( "test"); static {systation.out.println ( "테스트 정적");} public test () {system.out.println ( "테스트 생성자");} public static void main (string [] args) {new myclass ();}} class {System.out.out.out.out. person (string str) {system.out.println ( "person"+str);}} class myclass extends test {person person = new person ( "myclass"); static {system.out.println ( "myclass static");} public myclass () {system.out.println ( "myclass constructor"); 정적 테스트 1
정적 테스트 2
주요 방법에는 진술이 없지만 그 이유는 위에서 설명 되었기 때문에 여전히 출력 할 것입니다. 또한, 정적 블록은 클래스의 어느 곳에 나 어디에서나 나타날 수 있으며 (메소드 내부에 있지 않은 한, 아무 방법도 수행 할 수 없음) 정적 블록의 순서대로 실행이 실행됩니다.
위는 편집자가 귀하에게 소개 한 Java의 정적 키워드에 대한 포괄적 인 분석입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!