자바 의 static 와 final 의 각자 역할 과 연계
11524 단어 자바
프로그램 컨 텍스트 환경 에 따라 자바 키워드 final 은 '이것 은 바 꿀 수 없 는 것' 이나 '최종 적 인' 의 미 를 가지 고 비 추상 적 인 유형, 비 추상 적 인 구성원 방법 과 변 수 를 수식 할 수 있 습 니 다.디자인 이나 효율 이라는 두 가지 이해 때문에 변 화 를 막 아야 할 수도 있다.
final 클래스 는 계승 할 수 없습니다. 하위 클래스 가 없 으 면 final 클래스 의 방법 은 기본적으로 final 입 니 다.
final 방법 은 하위 클래스 의 방법 으로 덮어 쓸 수 없 지만 계승 할 수 있 습 니 다.
final 구성원 변 수 는 상수 입 니 다. 한 번 만 할당 할 수 있 고 할당 후 값 은 변 하지 않 습 니 다.
final 은 구조 방법 을 수식 하 는 데 사용 할 수 없다.
메모: 부모 클래스 의 private 구성원 방법 은 하위 클래스 에 덮어 쓸 수 없 기 때문에 private 형식의 방법 은 기본적으로 final 형식 입 니 다.
1. final 클래스
final , final
기본 값 은 모두 final 입 니 다.디자인 클래스 에서 만약 에 이런 클래스 가 하위 클래스 가 필요 하지 않 으 면 클래스 의 실현 디 테 일 은 변 하지 않 고 이 클래스 가 확장 되 지 않 을 것 이 라 고 확신 하면 final 클래스 로 디자인 합 니 다.
2. final 방법
하위 클래스 가 어떤 방법 을 덮어 쓰 는 것 을 허용 하지 않 는 다 면 이 방법 을 final 방법 으로 설명 할 수 있 습 니 다.
final 방법 을 사용 하 는 이 유 는 두 가지 가 있 습 니 다.
첫째, 방법 을 잠 그 고 모든 계승 류 가 그 의 미 를 수정 하고 실현 하 는 것 을 방지한다.
둘째, 효율 적 이다.컴 파 일 러 는 final 방법 을 호출 할 때 내장 메커니즘 으로 전환 되 어 실행 효율 을 크게 높 인 다.
예 를 들 면:
public class Test1 {
public static void main(String[] args) {
// TODO
}
public void f1() {
System.out.println("f1");
}
//
public final void f2() {
System.out.println("f2");
}
public void f3() {
System.out.println("f3");
}
private void f4() {
System.out.println("f4");
}
}
public class Test2 extends Test1 {
public void f1(){
System.out.println("Test1 f1 !");
}
public static void main(String[] args) {
Test2 t=new Test2();
t.f1();
t.f2(); // final
t.f3(); //
//t.f4(); // ,
}
}
3. final 변수 (상수)
final 로 장 식 된 구성원 변수 로 상수 를 표시 합 니 다. 값 이 정 해 지면 바 꿀 수 없습니다!
final 수식 변 수 는 세 가지 가 있 습 니 다. 정적 변수, 인 스 턴 스 변수 와 부분 변 수 는 각각 세 가지 유형의 상수 입 니 다.
다음 의 예 에서 알 수 있 듯 이 final 변수 에 초기 값 을 주면 값 은 더 이상 바 꿀 수 없다.
또한 final 변 수 를 정의 할 때 초기 값 을 주지 않 고 먼저 설명 할 수 있 습 니 다. 이 변 수 는 final 공백 이 라 고도 부 릅 니 다. 어떤 경우 에 도 컴 파일 러 는 공백 final 이 사용 하기 전에 초기 화 되 어야 합 니 다.그러나 final 공백 은 final 키워드 final 의 사용 에 있어 더욱 큰 유연성 을 제공 하기 때문에 한 가지 유형의 final 데이터 구성원 은 대상 에 따라 다 르 지만 변 함 없 는 특징 을 유지 할 수 있다.
package org.leizhimin;
public class Test3 {
private final String S = "final S";
private final int A = 100;
public final int B = 90;
public static final int C = 80;
private static final int D = 70;
public final int E; //final ,
public Test3(int x) {
E = x;
}
/**
* @param args
*/
public static void main(String[] args) {
Test3 t = new Test3(2);
//t.A=101; // ,final
//t.B=91; // ,final
//t.C=81; // ,final
//t.D=71; // ,final
System.out.println(t.A);
System.out.println(t.B);
System.out.println(t.C); //
System.out.println(t.D); //
System.out.println(Test3.C);
System.out.println(Test3.D);
//System.out.println(Test3.E); // , E final , .
System.out.println(t.E);
Test3 t1 = new Test3(3);
System.out.println(t1.E); //final E
}
private void test() {
System.out.println(new Test3(1).A);
System.out.println(Test3.C);
System.out.println(Test3.D);
}
public void test2() {
final int a; //final ,
final int b = 4; // --final
final int c; //final , .
a = 3;
//a=4; , .
//b=2; , .
}
}
4、final
final , , 。
public class Test4 {
public static void main(String[] args) {
new Test4().f1(2);
}
public void f1(final int i) {
//i++; //i final , .
System.out.print(i);
}
}
정적
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 가 아니 라 실현 되 어야 합 니 다.
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 과 final 에 의 해 수 정 된 인 스 턴 스 상수 에 대해 인 스 턴 스 자 체 는 더 이상 바 꿀 수 없 지만 일부 용기 유형 (예 를 들 어 Array List, HashMap) 의 인 스 턴 스 변 수 는 용기 변수 자 체 를 바 꿀 수 없 지만 용기 에 저 장 된 대상 을 수정 할 수 있다 는 점 은 편집 과정 에서 많이 사용 된다.
이렇게 많은 말 을 했 는 지 오히려 너 를 어 지 럽 혔 으 니 예 를 들 어 보 자.
public class TestStaticFinal {
private static final String strStaticFinalVar = "aaa";
private static String strStaticVar = null;
private final String strFinalVar = null;
private static final int intStaticFinalVar = 0;
private static final Integer integerStaticFinalVar = new Integer(8);
private static final ArrayList alStaticFinalVar = new ArrayList();
private void test() {
System.out.println("------------- ----------\r
");
System.out.println("strStaticFinalVar=" + strStaticFinalVar + "\r
");
System.out.println("strStaticVar=" + strStaticVar + "\r
");
System.out.println("strFinalVar=" + strFinalVar + "\r
");
System.out.println("intStaticFinalVar=" + intStaticFinalVar + "\r
");
System.out.println("integerStaticFinalVar=" + integerStaticFinalVar + "\r
");
System.out.println("alStaticFinalVar=" + alStaticFinalVar + "\r
");
//strStaticFinalVar=" "; // ,final , .
strStaticVar = " "; // ,static , .
//strFinalVar=" "; // , final , ( null), 。
//intStaticFinalVar=2; // , final , ( null), 。
//integerStaticFinalVar=new Integer(8); // , final , ( null), 。
alStaticFinalVar.add("aaa"); // , , 。 , 。
alStaticFinalVar.add("bbb"); // , , 。 , 。
System.out.println("------------- ----------\r
");
System.out.println("strStaticFinalVar=" + strStaticFinalVar + "\r
");
System.out.println("strStaticVar=" + strStaticVar + "\r
");
System.out.println("strFinalVar=" + strFinalVar + "\r
");
System.out.println("intStaticFinalVar=" + intStaticFinalVar + "\r
");
System.out.println("integerStaticFinalVar=" + integerStaticFinalVar + "\r
");
System.out.println("alStaticFinalVar=" + alStaticFinalVar + "\r
");
}
public static void main(String args[]) {
new TestStaticFinal().test();
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.