자바 static private 추가 연구

8806 단어 자바
자바 의 가장 중요 한 특징 중 하 나 는 패키지 입 니 다.이것 은 private proctected default Public 로 접근 권한 을 제어 해 야 합 니 다.
그 중 에 이해 하기 어 려 운 것 은 private 입 니 다.
private 접근 권한:이것 만 으로 는(1)이 클래스 의 방법 만 접근 할 수 있 습 니 다.(2)이 클래스 는 접근 할 수 없습니다.(3)그리고 다른 클래스 에서 이 클래스 를 예화 한 다음 에 이 비율 을 호출 하 는 방법 도 안 됩 니 다.(3)4)이불 류 는 물 려 받 을 수 없다.
(3)에 대한 이 해 는 다른 클래스 에서 실례 를 들 면 다른 클래스 에서 이 private 방법 을 방문 하 는 것 과 같다.
Static :
static 방법 은 정적 방법 으로 메모리 의 위 치 는 정적 저장 소 에 있 습 니 다.그것 은 유형 명 을 통 해 직접 방문 할 수 있다.그리고 몇 가지 static 방법 을 설명 하 든 하나 밖 에 없다.즉,모든 인 스 턴 스 가 하나의 방법 을 공유 하고 static 방법 은 static 방법 만 호출 할 수 있다 는 것 이다.
static 의 계승 에서 의 표현.
static 방법 은 계승 되 고 덮어 쓸 수 있 지만 덮어 쓸 때 하위 클래스 도 static 이 어야 합 니 다.
static 방법 에 서 는 this 를 사용 할 수 없습니다.슈퍼 와 같 습 니 다.이것 은 c+와 같 습 니 다.
stackoverflow 의 오류 가 발생 한 예
//parent
public class ParentStatic {
	public static void print(){
		System.out.println("************parent**************");
	}

}
//child
public class ChildStatic extends ParentStatic{

	public static void print(){
		System.out.println("*******************child******************");
//		ParentStatic.print();
                print(); //error occur,stack overflow
	}
}

//main
public class TestEntry {


	/**
	 * @param args
	 */

	public static void main(String[] args) {
		ChildStatic childStatic=new ChildStatic();
		childStatic.print();//you can also use "ChildStatic.print()" to access the "print()"
	}

}


//erro log
Exception in thread "main" java.lang.StackOverflowError
    at sun.nio.cs.UTF_8.updatePositions(UTF_8.java:58)
    at sun.nio.cs.UTF_8$Encoder.encodeArrayLoop(UTF_8.java:392)
    at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:447)
    at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:544)
    at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:252)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:106)
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190)
    at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111)
    at java.io.PrintStream.write(PrintStream.java:476)
    at java.io.PrintStream.print(PrintStream.java:619)
    at java.io.PrintStream.println(PrintStream.java:756)
    at com.song.ChildStatic.print(ChildStatic.java:6)
    at com.song.ChildStatic.print(ChildStatic.java:7)

//************************인터넷 에서 static 에 대해 비교적 잘 쓴 글************************************************
static 는'전역'또는'정적'이라는 뜻 으로 구성원 변수 와 구성원 방법 을 수식 하 는 데 도 정적 static 코드 블록 을 형성 할 수 있 지만 자바 언어 에는 전역 변수의 개념 이 없다.
static 에 의 해 수 식 된 구성원 변수 와 구성원 방법 은 이러한 종류의 모든 대상 에 독립 됩 니 다.즉,특정한 인 스 턴 스 에 의존 하지 않 고 모든 인 스 턴 스 에 의 해 공유 된다 는 것 이다.
이 클래스 가 불 러 오기 만 하면 자바 가상 머 신 은 클래스 이름 이 실 행 될 때 데이터 구역 의 방법 구역 에 따라 그들 을 찾 을 수 있 습 니 다.따라서 static 대상 은 대상 이 생 성 되 기 전에 접근 할 수 있 으 며,대상 을 참조 하지 않 아 도 됩 니 다.
Public 로 수 식 된 static 구성원 변수 와 구성원 방법 은 본질 적 으로 전역 변수 와 전역 방법 입 니 다.이러한 대상 시 를 설명 할 때 static 변수의 사본 을 생 성하 지 않 고 클래스 의 모든 인 스 턴 스 가 같은 static 변 수 를 공유 합 니 다.
static 변수 앞 에 private 수식 이 있 을 수 있 습 니 다.이 변 수 는 클래스 의 정적 코드 블록 이나 클래스 의 다른 정적 구성원 방법 에서 사용 할 수 있 음 을 나타 냅 니 다(물론 비 정적 구성원 방법 에서 도 사용 할 수 있 습 니 다-쓸데없는 말).그러나 다른 클래스 에서 클래스 이름 을 통 해 직접 사용 할 수 없다 는 점 이 중요 합 니 다.실제로 private 는 방문 권한 이 한정 되 어 있 음 을 알 아야 합 니 다.static 는 예화 하지 않 으 면 사용 할 수 있다 고 말 합 니 다.그러면 훨씬 쉽게 이해 할 수 있 습 니 다.static 앞 에 다른 접근 권한 키 워드 를 추가 하 는 효과 도 이와 같다.
static 수식 의 구성원 변수 와 구성원 방법 은 습관 적 으로 정적 변수 와 정적 방법 이 라 고 부 릅 니 다.클래스 이름 으로 직접 접근 할 수 있 습 니 다.방문 문법 은 클래스 이름,정적 방법 이름(매개 변수 목록...)클래스 이름 입 니 다.정적 변수 이름 입 니 다.
static 로 장 식 된 코드 블록 으로 정적 코드 블록 을 표시 합 니 다.자바 가상 머 신(JVM)이 클래스 를 불 러 올 때 이 코드 블록 을 실행 합 니 다.
1.static 변 수 는 클래스 구성원 변 수 를 정적 으로 분류 하 는 지 여부 에 따라 두 가지 로 나 눌 수 있 습 니 다.하 나 는 static 에 의 해 수 정 된 변수 로 정적 변수 나 클래스 변수 라 고 합 니 다.다른 하 나 는 static 에 의 해 수식 되 지 않 은 변수 로 인 스 턴 스 변수 라 고 합 니 다.
두 가지 차이 점 은 정적 변 수 는 메모리 에 하나의 복사(메모리 절약)만 있 고 JVM 은 정적 으로 한 번 만 메모 리 를 분배 합 니 다.클래스 를 불 러 오 는 과정 에서 정적 변수의 메모리 분 배 를 완성 하고 클래스 이름 으로 직접 접근 할 수 있 습 니 다(편리).물론 대상 을 통 해 접근 할 수 있 습 니 다(그러나 이것 은 추천 하지 않 습 니 다).인 스 턴 스 변수 에 대해 인 스 턴 스 를 만 들 지 않 으 면 인 스 턴 스 변수 에 메모리 가 한 번 분 배 됩 니 다.인 스 턴 스 변 수 는 메모리 에 여러 개의 복사 가 있 고 서로 영향 을 주지 않 습 니 다(유연).
그래서 다음 과 같은 두 가지 기능 이 필요 할 때 정적 변 수 를 사용 합 니 다.  대상 간 에 값 을 공유 할 때  변수 접근 이 편리 할 때
2.정적 방법 정적 방법 은 클래스 이름 을 통 해 직접 호출 할 수 있 고 모든 인 스 턴 스 도 호출 할 수 있 습 니 다.따라서 정적 방법 에 서 는 this 와 슈퍼 키 워드 를 사용 할 수 없습니다.소속 클래스 의 인 스 턴 스 변수 와 인 스 턴 스 방법(즉,static 이 없 는 구성원 변수 와 구성원 방법)에 직접 접근 할 수 없고 소속 클래스 의 정적 구성원 변수 와 구성원 방법 에 만 접근 할 수 있 습 니 다.인 스 턴 스 멤버 가 특정 대상 과 연결 되 어 있 기 때 문 입 니 다!이것 은 이해 해 야 합 니 다.그 이 치 를 알 고 싶 습 니 다.기억 이 아 닙 니 다!!static 방법 은 모든 인 스 턴 스 에 독립 되 어 있 기 때문에 static 방법 은 추상 적 인 abstract 가 아니 라 실현 되 어야 합 니 다.
예 를 들 어 편리 한 방법 으로 호출 하기 위해 자바 API 의 Math 클래스 의 모든 방법 은 정적 이 고 일반 클래스 내부 의 static 방법 도 다른 클래스 가 이 방법 에 대한 호출 을 편리 하 게 합 니 다.
정적 방법 은 클래스 내부 의 특수 한 방법 으로 필요 할 때 만 대응 하 는 방법 을 정적 으로 설명 하고 내부 의 방법 은 일반적으로 비 정적 이다.
3.static 코드 블록
static 코드 블록 은 정적 코드 블록 이 라 고도 부 릅 니 다.클래스 에서 클래스 구성원 에 독립 된 static 구문 블록 입 니 다.여러 개 있 을 수 있 고 위 치 는 마음대로 놓 을 수 있 습 니 다.그 어떠한 방법 에 도 없 으 며 JVM 로드 클래스 는 이러한 정적 코드 블록 을 실행 합 니 다.만약 에 static 코드 블록 이 여러 개 있 으 면 JVM 은 클래스 에 나타 난 선후 순서에 따라 순서대로 실 행 됩 니 다.코드 블록 마다 한 번 만 실 행 됩 니 다.예 를 들 면:
public class Test5 { private static int a; private int b;
static{ Test5.a=3; System.out.println(a); Test5 t=new Test5(); t.f(); t.b=1000; System.out.println(t.b); } static{ Test5.a=4; System.out.println(a); } public static void main(String[]args){/TODO 자동 생 성 방법 저장 루트}static{Test5.a=5;System.out.println(a); } public void f(){ System.out.println("hhahhahah"); } } 
실행 결과:3 hhahhahah 1000 4 5
정적 코드 블록 을 이용 하여 일부 static 변 수 를 할당 할 수 있 습 니 다.마지막 으로 이 예 들 을 다시 한 번 보 세 요.모두 static 의 main 방법 입 니 다.그러면 JVM 은 main 방법 을 실행 할 때 인 스 턴 스 를 만 들 지 않 고 직접 호출 할 수 있 습 니 다.
4.static 과 final 한 조각 은 어떤 static final 을 표시 하여 구성원 변수 와 구성원 방법 을 수식 하 는 지 간단하게'전체 상수'로 이해 할 수 있 습 니 다!변수 에 대해 서 는 값 을 주면 수정 할 수 없고 클래스 이름 을 통 해 접근 할 수 있 음 을 나타 낸다.방법 에 대해 서 는 덮어 쓸 수 없 음 을 표시 하 며,유사 이름 을 통 해 직접 방문 할 수 있 습 니 다.
때때로 당신 은 이러한 종류의 구성원 을 정의 하여 그 사용 을 그 어떠한 대상 에 도 완전히 독립 시 키 기 를 원 합 니 다.일반적으로 클래스 구성원 은 클래스 의 대상 을 통 해 방문 해 야 하지만,이러한 구성원 을 만 들 수 있 습 니 다.특정한 실례 를 인용 하지 않 고 스스로 사용 할 수 있 습 니 다.구성원 의 성명 앞 에 키워드 static(정적)을 추가 하면 이러한 구성원 을 만 들 수 있 습 니 다.만약 한 구성원 이 static 로 성명 된다 면,그것 은 클래스 의 모든 대상 이 생 성 되 기 전에 접근 할 수 있 으 며,어떠한 대상 도 인용 할 필요 가 없다.방법 과 변 수 를 모두 static 로 설명 할 수 있 습 니 다.static 멤버 들 의 가장 흔 한 예 는 main()이다.프로그램 이 실 행 될 때 main()을 호출 해 야 하기 때문에 static 로 밝 혀 졌 습 니 다.
static 로 설 명 된 변 수 는 실질 적 으로 전역 변수 입 니 다.대상 을 설명 할 때 static 변 수 를 복사 하지 않 고 모든 인 스 턴 스 변 수 는 같은 static 변 수 를 공유 합 니 다.static 라 고 성명 하 는 방법 은 다음 과 같은 몇 가지 제한 이 있 습 니 다.•다른 static 방법 만 사용 할 수 있 습 니 다.그것들 은 static 데이터 에 만 접근 할 수 있 습 니 다.이 는 this 나 슈퍼 를 어떤 방식 으로 도 인용 할 수 없습니다.계산 을 통 해 static 변 수 를 초기 화 할 필요 가 있다 면 static 블록 을 설명 할 수 있 습 니 다.Static 블록 은 이 클래스 가 불 러 올 때 만 실 행 됩 니 다.다음 예 에 표 시 된 클래스 는 static 방법,일부 static 변수,그리고 static 초기 화 블록 이 있 습 니 다://Demonstrate static variables,methods,and blocks.
class UseStatic { static int a = 3; static int b;
static void meth(int x) { System.out.println("x = " + x); System.out.println("a = " + a); System.out.println("b = " + b); }
static { System.out.println("Static block initialized."); b = a * 4; }
public static void main(String args[]) { meth(42); } }
UseStatic 클래스 가 불 러 오 면 모든 static 문장 이 실 행 됩 니 다.우선,a 는 3 으로 설정 되 었 고,이어서 static 블록 이 실행 되 었 으 며,마지막 으로 b 는 a*4 또는 12 로 초기 화 되 었 습 니 다.그리고 main(),main()을 호출 하여 meth()를 호출 하여 값 42 를 x 에 전달 합 니 다.3 개의 println()문 구 는 두 개의 static 변수 a 와 b,그리고 부분 변수 x 를 참조 합 니 다.
주의:static 방법 에서 모든 인 스 턴 스 변 수 를 인용 하 는 것 은 불법 입 니 다.
다음은 이 프로그램의 출력 입 니 다:
Static block initialized.x=42 a=3 b=12 는 클래스 를 정의 하 는 밖에서 static 방법 과 변 수 는 모든 대상 에 독립 되 어 사 용 됩 니 다.이렇게 하면,너 는 클래스 의 이름 뒤에 점 호 연산 자 를 붙 이기 만 하면 된다.예 를 들 어 클래스 밖에서 static 방법 을 호출 하려 면 다음 과 같은 일반적인 형식 을 사용 할 수 있 습 니 다.
classname.method( )
여기 서 classname 은 클래스 의 이름 입 니 다.이 클래스 에서 static 방법 을 정의 합 니 다.이 형식 은 대상 인용 변 수 를 통 해 비 static 방법 을 호출 하 는 형식 과 유사 하 다 는 것 을 알 수 있다.static 변 수 는 같은 형식 으로 접근 할 수 있 습 니 다.이것 이 바로 자바 가 전역 기능 과 전역 변 수 를 어떻게 실현 하 는 지 에 대한 제어 버 전 입 니 다.
다음은 하나의 예 다.main()에서 static 방법 callme()과 static 변수 b 는 클래스 밖에서 접근 합 니 다.
class StaticDemo { static int a = 42; static int b = 99; static void callme() {
System.out.println("a = " + a); } }
class StaticByName {
public static void main(String args[]) { StaticDemo.callme(); System.out.println("b = " + StaticDemo.b); } }
다음은 이 프로그램의 출력 입 니 다:
a = 42 b = 99
static 구성원 은 클 라 스 가 만 든 인 스 턴 스 에 접근 할 수 없습니다.
static 수식 을 넣 지 않 은 멤버 가 대상 멤버 라면 각 대상 의 소유 다.
static 수식 을 추가 한 구성원 은 클래스 구성원 으로 하나의 클래스 에서 직접 호출 하여 모든 대상 에 게 공유 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기