자바 프로 그래 밍 함정 - 클래스 멤버 초기 화
첫 번 째 클래스, 구성원 변 수 를 초기 화 하 는 것 은 구조 방법 전에
주로 TIJ 의 코드 를 참고 하여 문 제 를 설명 합 니 다!!
1. 클래스 태그 새로 만 들 기
package mark.initial; public class Tag {/ * * 구조 방법 * * @ param maker * / public Tag (int maker) {System. out. println ("tag (" + maker + ")");}}
2. 클래스 카드 새로 만 들 기
package mark.initial; public class Card {Tag tag 1 = new Tag (1); / * * * 구조 방법 * / public Card () {System. out. println ("card ()"); Tag tag 3 = new Tag (33);} Tag tag 2 = new Tag (2); / * * * 구성원 방법 * / public void f () {System. out. println ("f ()");} Tag tag 3 = new Tag (3);}
3. 새 테스트 클래스
package mark.initial; public class TestInitial { public static void main(String[] args) { Card c = new Card(); c.f(); } }
결 과 를 보기 전에 간단하게 분석 해 보 세 요.카드 에는 태그 대상 이 곳곳에 있어 지저분 해 보인다.사실 이것 은 고의 적 인 것 입 니 다. 우 리 는 클래스 의 구성원 변 수 는 기본 값 으로 초기 화 될 것 이라는 것 을 알 고 있 습 니 다. 예 를 들 어 인용 초기 화 는 null, int 기본 값 은 0, float 기본 값 은 0 등 입 니 다. 만약 에 이 구성원 변수의 값 을 지정 하지 않 았 을 때.
테스트 클래스 TestInitial 에서 new 카드 는 구성원 변수 tag 1, tag 2, tag 3 를 null 로 초기 화 합 니 다.마지막 으로 Card 는 자신의 구조 함 수 를 호출 하기 때문에 결 과 는 다음 과 같다.
tag(1) tag(2) tag(3) card() tag(33) f()
두 번 째 유형, 구성원 변 수 는 구조 방법 이후 초기 화 됩 니 다.
하위 클래스 구성원 변수 초기 화, 부모 클래스 Linux, 하위 클래스 User 부모 클래스 의 print () 방법 을 다시 쓰 고 이 방법 에서 구성원 변수 name 값 을 변경 합 니 다.
package my.test;
public class Linux {
int size = 10;
String name = "Linux";
/**
*
*/
public Linux() {
System.out.println("I'm Linux OS!");
print();
}
public void print() {
System.out.println(" Linux--print()");
}
}
class User extends Linux {
String name = "ubuntu";
@Override
public void print() {
name = "ubuntu10.10";
System.out.println(" User--print()");
}
}
테스트 코드:
class TestLinux { public static void main(String[] args) { User user = new User(); System.out.println(user.name); } }
main 방법 에서 User 인 스 턴 스 대상 user 를 만 들 면 User 는 자신의 구조 방법 을 호출 합 니 다. 그러나 우 리 는 하위 클래스 가 구조 방법 에서 부모 클래스 의 구조 방법 을 먼저 호출 한 다 는 것 을 알 고 있 습 니 다. 그러면 User 의 부모 류 Linux 는 자신의 구조 방법 을 실행 하여 print () 방법 을 호출 합 니 다. 하위 클래스 User 가 부모 클래스 를 덮어 쓰 는 방법 이기 때문에 하위 클래스 의 print () 방법 을 호출 합 니 다.name 의 값 을 ubuntu 10.10 으로 바 꾸 고 구조 방법 이 실 행 됩 니 다. User 의 구성원 변 수 를 초기 화하 기 시작 하면 name 이 ubuntu 입 니 다. 인쇄 결 과 는 다음 과 같 습 니 다.
I'm Linux OS!
User--print()
ubuntu
세 번 째 유형, 사실은 이것 은 두 번 째 유형의 또 다른 사례 이다.
다음은 단일 모드 입 니 다.
package my.test; public classloadTest {/ 성명 류 구성원 변 수 를 만 들 고 이 대상 static final ClassloadTest test = new ClassloadTest (); public static int a = 5; public static int b = 8; / * * * 개인 구조 방법 * / private ClassloadTest () {a +; b +;}/ * * 클래스 의 인 스 턴 스 대상 * * @ return ClassloadTest 인 스 턴 스 대상 * / public static ClassloadTest getInstance () {return test;}} 가 져 오기
자, 상기 코드 를 알 아 본 후에 테스트 코드 를 보 세 요.
class Test { public static void main(String[] args) { System.out.println("a = " + ClassloadTest.getInstance().a); System.out.println("b = " + ClassloadTest.getInstance().b); } }
답 이 발표 되 기 전에 대부분의 사람들 은 결과 가 다음 과 같다 고 자신 한다.
a = 6 b = 9
하하, 너 너무 충동 적 이 야!!!틀 렸 어, 잘 생각해 봐!!
다음 코드 는 Classloadtest 를 만 드 는 것 입 니 다. 대상 test:
/ / 클래스 구성원 변 수 를 설명 하고 이 대상 static final ClassloadTest test = new ClassloadTest () 를 만 듭 니 다.
테스트 클래스 에서 클래스 의 인 스 턴 스 를 얻 으 면 대상 을 만 들 고 구조 방법 을 호출 합 니 다. 사실은 발생 하 는 시간 은 이 렇 습 니 다.
< 1 > test 를 null, a = 0, b = 0 으로 초기 화 합 니 다. 이 값 은 기본 값 입 니 다. 수 동 으로 부여 한 값 5 와 8 이 아 닙 니 다.
<2> test = new Classloadtest () 는 구조 방법 을 호출 하여 a = 1, b = 1
< 3 > 순서 실행 코드, 정적 변수 a = 5, b = 8, 그러면 원래 a = 1, b = 1 이 덮어 씁 니 다.
ok, 실행 결 과 는 다음 과 같 습 니 다.
a = 5 b = 8
코드 중 static final ClassloadTest test = new ClassloadTest () 를 변경 하면;위치 가 달라 질 거 야.현재 ClassloadTest 클래스 를 바 꾸 려 면 다음 과 같 습 니 다.
package my.test; public classloadTest {public static int a = 5; public static int b = 8; / 성명 류 구성원 변 수 를 만 들 고 이 대상 static final ClassloadTest test = new ClassloadTest (); / * * * 개인 구조 방법 * / private ClassloadTest () {a +; b +;}/ * * 클래스 의 인 스 턴 스 대상 * * @ return ClassloadTest 인 스 턴 스 대상 * / public static ClassloadTest getInstance () {return test;}} 가 져 오기
위의 테스트 방법 을 사용 하 시 겠 습 니까? 결 과 는 다음 과 같 습 니 다.
a = 6 b = 9
분석 은 다음 과 같다.
<1> test 를 null, a = 0, b = 0 으로 초기 화 합 니 다. 이 값 은 기본 값 입 니 다. 수 동 으로 부여 한 값 5 와 8 이 아 닙 니 다.
<2> a=5,b=8
<3> test = new Classloadtest () 는 구조 방법 을 호출 하여 a = 6, b = 9
소결:
여기까지 말 하면 우 리 는 적어도 아래 의 이 치 를 알 고 있다.
< 1 > 대상 을 대상 으로 프로 그래 밍 을 하려 면 성명 변수의 순서 도 고려 해 야 한다.
<2> 자바 의 성명 과 초기 화 는 원자 조작 이 아 닙 니 다. 즉, 일체화 가 아 닙 니 다. 즉, 성명 후 기본 값 이 있 을 것 입 니 다. 초기 화 값 은 수 동 으로 할당 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.