정적은 Java의 또 다른 중요한 키워드입니다. 프로그램의 실행 성능을 향상시키고 프로그램의 구조를 최적화 할 수 있습니다. 주요 응용 프로그램은 다음과 같습니다.
1. 해당 멤버와 모든 객체를 공유하는 것을 실현하기 위해 클래스 변수/정적 변수라고 불리는 정적으로 수정 된 멤버 변수.
2. 클래스 메소드/static 메소드라고하는 static으로 수정 된 멤버 메소드는 객체를 만들지 않고 클래스 이름을 통해 직접 호출 할 수 있습니다.
3. 프로그램 성능을 최적화하기 위해 정적 코드 블록을 형성합니다.
4. 정적 리드 패키지, 일반적으로 클래스 메소드를 현재 클래스로 직접 가져 오도록 클래스 메소드를 메소드 이름을 사용하여 직접 호출 할 수 있도록 더 편리합니다.
5. 내부 클래스를 수정하고 외부 클래스를 인스턴스화하지 않고 내부 클래스를 호출하십시오.
다음 코드 설명이 첨부되어 있습니다.
공개 클래스 학생 {문자열 이름; 정적 int 연령; public String toString () {return "name :" + name + ", age :" + age; } public static void main (String [] args) {Student S1 = new Student (); s1.name = "Zhang San"; s1.age = 20; 학생 S2 = 신입생 (); s2.name = "li si"; s2.age = 10; System.out.println (S1); System.out.println (S2); }}/** 출력 결과 이름 : Zhang San, 나이 : 10name : li si, 나이 : 10*/위에서 언급 한 바와 같이, 두 객체 S1과 S2는 메모리의 힙 영역의 다른 주소에 저장되므로 서로를 방해하지 않습니다. 그러나 정적 키워드는 멤버 변수 연령을 수정하여 클래스가 객체에 속하는 대신 속에 속하며 해당 클래스의 인스턴스의 모든 객체를 공유하고 사용할 수 있습니다. 따라서 출력 연령은 모두 10에 할당됩니다. 정적을 제거하면 분명히 객체는 서로 영향을 미치지 않으며 출력은 다음과 같습니다.
이름 : Zhang San, 나이 : 20name : Li Si, 나이 : 10
위에서 언급했듯이 Out1이 out2를 호출 할 때 오류가 발생했습니다. 이 코드에서 정적 메소드는 비 정적 멤버 변수 및 멤버 메소드를 호출 할 수 없음을 알 수 있습니다. 비 정적 메소드는 정적 멤버 변수 및 멤버 메소드를 호출 할 수 있습니다. STATIN은 회원의 액세스 권한에 영향을 미치지 않습니다. Java의 액세스 권한에 영향을 줄 수있는 키워드는 개인, 공개, 보호 및 기본값입니다.
공개 클래스 테스트는 기본 {static {System.out.println ( "static static block 1")을 확장합니다. } public test () {system.out.println ( "테스트 생성자"); } public static void main (String [] args) {new test (); }} class base {static {systation.out.println ( "static static block 2"); } public base () {system.out.println ( "기본 생성자"); }}위에서 언급했듯이 두 문장을 기억하십시오. 정적 코드 블록에는 클래스로드가로드됩니다. 정적으로 수정 된 변수 메소드는 다른 변수 메소드보다 먼저로로드됩니다. 서브 클래스가로드되면 부모 클래스가 먼저로드됩니다. 이것으로부터 우리는 분석 할 수 있습니다. 실행 시작시 기본 메소드는 먼저 주요 방법을 찾아야합니다. 주요 방법은 프로그램 입구이지만 기본 메소드를 실행하기 전에 먼저 테스트 클래스를로드해야합니다. 테스트 클래스를로드 할 때 테스트 클래스가 기본 클래스에서 상속되어 기본 클래스를 먼저로드 할 것입니다. 기본 클래스를로드 할 때 정적 블록이있는 다음 정적 블록을 실행합니다. 기본 클래스가로드되면 테스트 클래스가 계속로드 된 다음 테스트 클래스에 정적 블록이있어 정적 블록이 실행됩니다. 필요한 클래스를로드 한 후 주요 메소드가 실행되기 시작합니다. 기본 메소드에서 New Test ()를 실행할 때 부모 클래스의 생성자가 먼저 호출 된 다음 자체 생성자로 호출됩니다. 따라서 작동 결과는 다음과 같습니다.
정적 정적 블록 2static 정적 블록 1- 기업 생성자 테스트 생성자
/* a.java 파일*/패키지 com.dogo.test; public class a {public static void outword (object o) {System.out.println (o); }}/*b.java 파일*/import static com.dogo.test.a. } /** 출력*안녕하세요 세계! */}위에서 언급했듯이 A.java에는 간단한 정적 방법이 포함되어 있습니다. B.java에서는 정적 키워드를 사용하여 클래스 A를 가져옵니다. 따라서 클래스 메소드를 호출하기 위해 "클래스 이름. 메소드 이름"을 사용할 필요가 없습니다. "메소드 이름"을 직접 사용하여 클래스 자신의 메소드와 마찬가지로 클래스 메소드를 호출 할 수 있습니다.
/*outer.java*/public class OUTER {static {System.out.println ( "OUTER STATIC BLOCK"); } public OUTER () {System.out.println ( "외부 생성자"); } 정적 클래스 내부 {static {System.out.println ( "내부 정적 블록"); } public Inner () {System.out.println ( "내부 생성자"); }}}}/*test.java*/public class test {public static void main (String [] args) {new outer.inner (); }}위에서 언급 한 바와 같이, 내부 클래스를 정적으로 수정하는 것을 잊지 말고, 외부 클래스는 외부 클래스를로드하는 동안 정적으로 수정 된 내부 클래스가로드되므로 외부 클래스를 직접 호출 할 수 있으므로 외부 클래스는 내부 클래스를 직접 호출 할 수 있으므로 외부 클래스를 인스턴스화하지 않고 정적 내부 클래스를 직접 호출 할 수 있습니다. 이 예에서는 주요 테스트 방법을 입력하기 전에 테스트 클래스를로드 한 다음 새 OUTER.inner ()를 실행하십시오. 참고 : 내부는 정적이므로 외부 클래스를로드하고 외부 클래스를 인스턴스화 할 필요가 없습니다. 내부를 직접로드하고 인스턴스화 할 수 있습니다. 작업 결과는 다음과 같습니다.
내부 정적 블록 내부 생성자
DA QIAO Note : STATIC의 또 다른 중요한 응용은 싱글 톤 디자인 패턴을 구현하는 것입니다. 단일 이익 패턴의 특징은 클래스에 하나의 인스턴스 만 가질 수 있다는 것입니다. 이 기능을 실현하기 위해 클래스 생성자는 숨겨져 있어야합니다. 생성자는 비공개로 선언되므로 외부 세계는이 유형의 객체를 직접 생성 할 수 없으며 클래스가 제공 한 메소드를 통해서만 클래스 객체를 얻을 수 있습니다. 따라서 객체를 생성하는 방법은 정적으로 만 선언 할 수 있습니다. 프로그램 예제는 다음과 같습니다.
클래스 Singledemo {private static singledemo ins = null; private singledemo () {} public static singledemo getins () {if (ins == null) {ins = new Singledemo (); } return ins; }}