Java 정적 키워드 및 Java 정적 변수 및 정적 방법
정적 수정자는 변수 및 메소드가 "정적"임을 나타내는 방법과 함께 사용할 수 있습니다.
정적 변수와 정적 메소드는 클래스 이름을 통해 액세스 할 수 있으며 클래스의 정적 멤버에 액세스하기 위해 클래스의 객체를 만들 필요가 없으므로 정적으로 수정 된 멤버를 클래스 변수 및 클래스 메소드라고도합니다. 정적 변수는 인스턴스 변수와 다르며 인스턴스 변수는 객체마다 다르기 때문에 항상 객체를 통해 액세스됩니다.
다음 예를 참조하십시오.
공개 클래스 데모 {정적 int i = 10; i); demo ob (new demo.out.println);
실행 결과 :
클래스 변수 i = 10 인스턴스 변수 j = 20
정적 메모리 할당
정적 변수는 클래스에 속하며 독립 객체에 속하지 않으므로 클래스 인스턴스를 만들지 않고도 정적 변수에 액세스 할 수 있습니다. 이 결과는 컴파일러가 전체 클래스에 대한 정적 변수의 사본 만 생성하기 때문에 하나의 메모리 공간 만 할당되지만 이러한 인스턴스는 메모리를 공유합니다. 인스턴스 변수는 객체가 생성 될 때마다 메모리 공간이 서로 독립적이며 객체 A의 인스턴스에 영향을 미치지 않습니다.
다음 코드를 참조하십시오.
공개 클래스 {static int i; ; obj2 .j = " + obj2.j);}}
실행 결과 :
obj1.i = 10, obj1.j = 20obj2.i = 10, obj2.j = 0
참고 : 객체를 통해 정적 변수에 액세스 할 수 있지만 권장하지 않으며 컴파일러는 경고도 생성됩니다.
위의 코드에서, I는 OBJ2를 통해 I의 값을 변경하는 것은 OBJ1을 통해 J의 값을 변경합니다. OBJ1.I와 OBJ2.i는 동일한 메모리 공간을 가리키고 OBJ1.J와 OBJ2.J는 다음 그림을 참조하십시오.
참고 : 클래스가로드되면 정적 변수가 초기화됩니다. 즉, 클래스가로드되는 한이 정적 변수를 사용하는지 여부에 관계없이 초기화됩니다.
요약 : 클래스 변수는 클래스가로드되면 클래스 인스턴스 객체가 생성되면이 메모리 (클래스 변수)가 공유됩니다. 변수 변경은 다른 객체에 영향을 미칩니다. 외부에 액세스하는 두 가지 방법은 객체를 통한 액세스 또는 클래스 이름을 통한 액세스입니다.
정적 방법
정적 메소드는 객체에서 작업을 수행 할 수없는 메소드입니다. 예를 들어, 수학 클래스의 pow () 메소드는 x의 a의 전력을 계산하는 데 사용되는 Math.pow (x, a)의 구문을 가진 정적 메소드이며 수학을 만들 필요가 없습니다. 사용될 때 물체.
정적 메소드는 객체를 작동 할 수 없기 때문에 정적 메소드에서 인스턴스 변수에 액세스 할 수 없으며 자체 클래스의 정적 변수에만 액세스 할 수 있습니다.
정적 방법은 다음 상황에서 사용할 수 있습니다.
메소드는 객체 상태에 액세스 할 필요가 없으며 필요한 매개 변수는 명시 적 매개 변수 (예 : math.pow ())에 의해 제공됩니다.
메소드는 클래스의 정적 변수에만 액세스하면됩니다.
독자들은 main ()가 객체에서 작동하지 않는 정적 메소드임을 알아 차렸을 것입니다. 실제로 프로그램 시작 시점에는 객체가 없으며 Main () 메소드는 프로그램 입력이며 실행되며 프로그램에 필요한 개체가 작성됩니다.
정적 변수 및 정적 방법 요약 :
클래스의 정적 방법은 정적 변수에만 액세스 할 수 있습니다.
클래스의 정적 방법은 비 정적 방법을 직접 호출 할 수 없습니다.
액세스 제어 권한이 허용되면 객체를 통해 정적 변수와 정적 메소드에 액세스 할 수 있지만 권장되지 않습니다.
현재 객체는 정적 방법에 존재하지 않으므로 사용할 수 없으며 물론 슈퍼를 사용할 수 없습니다.
정적이 아닌 방법으로 정적 방법을 덮어 쓸 수 없습니다.
생성자는 정적 선언을 허용하지 않습니다.
로컬 변수는 정적으로 수정할 수 없습니다.
정적 방법의 예 :
공개 클래스 데모 {int x, int y) {return x + y; "10 + 10 =" + sum);
실행 결과 :
10+10 = 20
정적 메소드에는 호출되는 클래스의 인스턴스가 필요하지 않으므로이 값이 없으며 인스턴스 변수에 액세스 할 수 없으므로 컴파일 오류가 발생합니다.
참고 : 인스턴스 변수는 객체를 통해서만 액세스 할 수 있으며 클래스를 통해 액세스 할 수 없습니다.
정적 이니셜 라이저 (정적 블록)
블록은 버팀대로 둘러싸인 코드 조각입니다. 정적 이니셜 라이저는 클래스 및 메소드 외부에 존재하는 정적 블록입니다. 정적 초기화기는 클래스가로드 된 경우 (클래스가 처음으로 사용되는 경우) 한 번만 실행되며 종종 정적 변수를 초기화하는 데 사용됩니다.
샘플 코드 :
공개 클래스 데모 {public static int i; " + i);} public static void main (String [] args) {System.out.println ("demo.i = " + demo.i); new demo (). test ();}}
작업의 결과는 다음과 같습니다.
이제 static block.demo.i = 10test 메소드에서 : i = 10
정적 가져 오기
정적 가져 오기는 정적 변수와 정적 클래스 방법을 가져 오는 데 사용되는 Java 5의 새로운 기능입니다.
일반적으로 우리는 이것을 수입 수업에 씁니다.
packagename.classname 가져 오기; // 특정 클래스를 가져옵니다
또는
Packagename 가져 오기. // 패키지의 모든 클래스를 가져옵니다
정적 가져 오기는 다음과 같이 작성할 수 있습니다.
static packagename.classname.methonname을 가져옵니다. // 특정 정적 메소드를 가져옵니다
또는
static packagename.classname을 가져옵니다.*;
가져 오면 현재 클래스의 메소드 이름으로 정적 메소드를 직접 호출 할 수 있으며 더 이상 ClassName.MethodName을 사용하여 액세스 할 필요가 없습니다.
자주 사용되는 정적 변수 및 정적 방법의 경우 정적으로 가져올 수 있습니다. 정적 가져 오기의 장점은 출력 명령문 시스템과 같은 일부 작업을 단순화 할 수 있다는 것입니다. 다음 번에 바로 다음에 전화하십시오.
다음 코드를 참조하십시오.
static java.lang.system.*; import static java.lang.math.random; public class demo {public static void main (string [] args) {out.println ( "random number로 생성 :" + random () );}}
실행 결과 :
생성 된 무작위 숫자 : 0.05800891549018705
Java 최종 키워드 : 블록 상속 및 다형성 <br /> Java의 클래스, 변수 및 메소드를 선언 할 때 키워드 최종을 사용하여 수정할 수 있습니다. Final에 의해 수정 된 데이터는 "최종 상태"의 특성을 가지며 "최종"을 의미합니다. 특정 규정은 다음과 같습니다.
Final이 수정 한 클래스는 상속받을 수 없습니다.
최종 수정 방법은 서브 클래스로 다시 작성할 수 없습니다.
최종 (멤버 변수 또는 로컬 변수)에 의해 수정 된 변수는 상수가되어 한 번만 할당 할 수 있습니다.
Final에 의해 수정 된 회원 변수는 선언 당시 과제가 없으면 할당 할 가능성이 단 한 번만있을 수 있으며 생성자에만 명시 적으로 할당 할 수 있습니다. 사용된.
Final에 의해 수정 된 로컬 변수는 할당하지 않았다고 선언 한 다음 한 번에 할당 될 수 있습니다.
최종은 일반적으로 수학 삼각형 방법, 지수화 작업 및 기타 함수를 구현하는 방법, 수학 상수 π = 3.141593, e = 2.71828 et al.
실제로, 최종 상태를 보장하기 위해 위의 방법과 상수를 제공하는 java.lang.math 클래스도 최종으로 정의되었습니다.
유형 (모든 클래스 유형)을 참조하는 변수가 최종으로 표시되면 변수는 다른 객체를 가리킬 수 없습니다. 그러나 객체의 내용은 참조 자체 만 최종적이기 때문에 변경할 수 있습니다.
변수가 최종적으로 표시되면 결과는 일정하게 만들 수 있습니다. 최종 변수의 값을 변경하려면 컴파일 오류가 발생합니다. 다음은 최종 변수를 올바르게 정의하는 예입니다.
공개 최종 int max_array_size = 25;
상수는 최종 수정이 있기 때문에 상속 될 수 없습니다.
다음 코드를 참조하십시오.
공개 최종 클래스 데모 {public static final int total_number = 5; ++ total_number; 보조 할당 수행}}
Final은 클래스를 수정하여 클래스가 하위 클래스를 도출하는 것을 방지 할 수 있습니다. 이것은 문자열이 참조되면 다른 클래스의 문자열이 아니라 클래스 문자열의 문자열이어야하기 때문에 보안상의 이유로 수행됩니다 (문자열 클래스는 악의적으로 상속되고 변조 될 수 있음).
메소드는 또한 최종에 의해 수정 될 수 있으며, 최종에 의해 수정 된 메소드는 최종적으로 쓸 수 없으며, 최종에 의해 수정 된 변수는 객체가 생성 된 후에 값을 변경할 수 없습니다. 클래스가 최종으로 선언되면 해당 클래스에 포함 된 방법은 최종적으로 암시 적으로 선언되지만 변수는 그렇지 않습니다.
최종에 의해 수정 된 방법은 정적 결합이며 다형성을 생성하지 않습니다 (동적 바인딩). Java에서는 정적 또는 개인에 의해 수정 된 방법이 동적 바인딩이 의미가 없기 때문에 암시 적으로 최종적으로 선언됩니다.
동적 바인딩은 자원을 소비하고 종종 필요하지 않기 때문에 일부 프로그래머는 다형성을 사용해야 할 충분한 이유가 없다면 모든 방법을 최종으로 수정해야한다고 생각합니다.
JVM의 인스턴트 컴파일러는 프로그램의 작동 정보를 실시간으로 모니터링 할 수 있고 클래스 간의 상속 관계를 정확하게 알 수 있기 때문에 이러한 이해는 약간 극단적입니다. 메소드가 덮어 쓰지 않고 짧은 경우 컴파일러는이를 최적화 할 수 있으며, 이는 인라인이라고합니다. 예를 들어, e.getName ()에 대한 인라인 호출은 e.Name 변수에 액세스하는 것으로 대체됩니다. 전화를 처리하는 지침을 처리 할 때 CPU가 사용한 지점 전송이 프리 페치 명령의 정책을 방해 할 것이기 때문에 이것은 의미있는 개선입니다. 따라서 인기가없는 것으로 간주되기 때문입니다. 그러나 다른 클래스에서 getName ()가 덮어 쓰기가 있으면 컴파일러는 덮어 쓰기 코드가 무엇을할지 알 수 없으므로 감소 할 수 없습니다.