자바 프로 그래 밍 사상 학습 로그 - 초기 화 및 청소
20835 단어 자바 프로 그래 밍 사상
자바 에는 기본 구조 기 가 있 으 며, 파 라 메 트릭 구조 기 입 니 다.대상 을 만 드 는 방법 을 지정 하기 위해 파 라 메 터 를 가 진 구조 기도 있다.구조 기 는 대상 이 생 성 될 때 초기 화 되 고 자바 는 사용자 가 대상 을 조작 할 능력 이 있 기 전에 해당 하 는 구조 기 를 자동 으로 호출 합 니 다.
구조 기 이름 규칙 1. 구조 기 는 클래스 와 같은 이름 을 사용 합 니 다. 2. '모든 방법 이니셜 소문 자' 의 프로 그래 밍 스타일 은 구조 기 가 자바 에 적용 되 지 않 습 니 다. '초기 화' 와 '생 성' 을 한데 묶 으 면 분리 할 수 없습니다.
구조 기 도 방법 인 만큼 구조 기 를 다시 불 러 올 수 있 고 구조 기 를 다시 불 러 올 수 있 으 며 생 성 대상 의 다양한 방식 을 확보 할 수 있다.물론 클래스 의 방법 에 대해 서도 무 거 운 짐 을 실 을 수 있다.재 부팅 방법 을 구분 합 니 다. 1. 재 부팅 방법 마다 유일한 매개 변수 형식 목록 이 있어 야 합 니 다.2. 매개 변수 유형 은 같 지만 순서 가 다 르 면 서로 다른 방법 을 구분 할 수 있 습 니 다. 그러나 일반적으로 이렇게 하지 마 십시오. 코드 를 유지 하기 어렵 기 때 문 입 니 다.
기본 형식 과 관련 된 리 셋 1. 들 어 오 는 데이터 형식 (실제 매개 변수 형식) 이 방법 에서 설명 한 형식 매개 변수 형식 보다 작 으 면 실제 데이터 형식 이 제 시 됩 니 다.char 형식 이 조금 다 르 기 때문에 적당 한 char 매개 변 수 를 찾 을 수 없 으 면 char 를 int 로 직접 향상 시 킵 니 다.2. 들 어 오 는 실제 매개 변수 가 과부하 방법 에서 설명 한 매개 변수 보다 크 면 유형 전환 을 통 해 협소 화 전환 을 수행 합 니 다.리 턴 값 으로 리 셋 방법 을 구분 할 수 없습니다.
기본 구조 기 1. 기본 구조 기의 역할 은 '기본 대상' 을 만 드 는 것 입 니 다.클래스 에 구조 기 가 없 으 면 컴 파일 러 가 자동 으로 구조 기 를 만들어 줍 니 다.2. 구조 기 (인자 가 있 든 없 든) 가 정의 되 어 있 으 면 컴 파일 러 는 기본 구조 기 를 자동 으로 만 드 는 것 을 도와 주지 않 습 니 다.
this 키 워드 는 방법의 내부 에서 현재 대상 에 대한 인용 을 얻 습 니 다.방법 내부 에서 같은 종류의 다른 방법 을 호출 하면 this 를 사용 하지 않 고 직접 호출 하면 된다.현재 방법 중의 this 인용 은 같은 종류의 다른 방법 으로 자동 으로 인 용 됩 니 다.
public class Leaf {
int i = 0;
Leaf increment() {
i++;
return this;
}
void print() {
System.out.println("i = " + i);
}
public static void main(String[] args) {
Leaf x = new Leaf();
x.increment().increment().increment().print();
}
} /* Output:
i = 3
*///:~
현재 대상 을 다른 방법 으로 전달 합 니 다.
class Person {
public void eat(Apple apple) {
Apple peeled = apple.getPeeled();
System.out.println("Yummy");
}
}
class Peeler {
static Apple peel(Apple apple) {
// ... remove peel
return apple; // Peeled
}
}
class Apple {
Apple getPeeled() { return Peeler.peel(this); }
}
public class PassingThis {
public static void main(String[] args) {
new Person().eat(new Apple());
}
} /* Output:
Yummy
*///:~
구조 기 에서 다른 구조 기 를 호출 합 니 다. 주의: this 자체 가 현재 대상 에 대한 인용 을 표시 합 니 다.구조 기 에서 this 에 매개 변수 목록 을 추가 하면 이 매개 변수 목록 에 맞 는 구조 기 에 대한 명확 한 호출 이 발생 합 니 다.이렇게 해서 다른 구조 기 를 호출 하 는 데 직접적인 경로 가 생 겼 다.
public class Flower {
int petalCount = 0;
String s = "initial value";
Flower(int petals) {
petalCount = petals;
System.out.println("Constructor w/ int arg only, petalCount= "
+ petalCount);
}
Flower(String ss) {
System.out.println("Constructor w/ String arg only, s = " + ss);
s = ss;
}
Flower(String s, int petals) {
this(petals);
//! this(s); // Can't call two!
this.s = s; // Another use of "this"
System.out.println("String & int args");
}
Flower() {
this("hi", 47);
System.out.println("default constructor (no args)");
}
void PetalCount() {
//! this(11); // Not inside non-constructor!
System.out.println("petalCount = " + petalCount + " s = "+ s);
}
public static void main(String[] args) {
Flower x = new Flower();
x.PetalCount();
}
} /* Output:
Constructor w/ int arg only, petalCount= 47
String & int args
default constructor (no args)
petalCount = 47 s = hi
*///:~
구조 기 Flower (String s, int petals) 는 this 로 구조 기 를 호출 할 수 있 지만 두 개 를 호출 할 수 없습니다. 또한 구조 기 를 시작 부분 으로 해 야 합 니 다. 그렇지 않 으 면 컴 파일 이 잘못 되 었 습 니 다.
구조 방법 을 통 해 외부 에서 들 어 오 는 매개 변 수 를 클래스 의 구성원 변수 에 할당 하려 면 구조 방법의 형식 매개 변수 이름과 클래스 의 구성원 변수 이름 이 같 습 니 다.
class Person{
String name;
public Person(String name){
this.name = name;
}
}
2. 청소
일반적으로 자바 의 쓰레기 수 거 기 는 쓸모없는 대상 이 차지 하 는 메모리 공간 을 회수 하 는 것 을 책임 집 니 다. 그러나 특수 한 경우 도 있 습 니 다. 대상 (new 로 만 든 것 이 아니 라) 이 특수 한 메모리 영역 을 얻 었 다 고 가정 합 니 다. 쓰레기 수 거 기 는 new 에서 분 배 된 메모리 만 방출 하기 때 문 입 니 다. 이러한 상황 에 대응 하기 위해 자바 는 클래스 에서 finalize () 라 는 이름 을 정의 할 수 있 습 니 다.방법 입 니 다. 작업 원리 인 '가정' 은 다음 과 같 습 니 다. 쓰레기 수 거 기 는 방출 대상 이 차지 하 는 저장 공간 을 준비 하면 먼저 이 방법 을 사용 하고 다음 쓰레기 수 거 동작 이 발생 할 때 만 진정 으로 회수 대상 이 차지 하 는 메모 리 를 사용 할 수 있 습 니 다. 따라서 이 방법 을 사용 하면 쓰레기 수 거 시간 에 특별한 청 소 를 할 수 있 습 니 다.
여기 finallze () 는 C + + 의 분석 함수 가 아 닙 니 다. C + + 의 대상 은 반드시 소각 되 지만 자바 의 대상 은 항상 쓰레기 로 회수 되 는 것 이 아 닙 니 다. 또는 다시 말 하면 1. 대상 은 쓰레기 로 회수 되 지 않 을 수 있 습 니 다. 2. 쓰레기 수 거 는 '분석' 과 같 지 않 습 니 다. 3. 쓰레기 수 거 는 메모리 와 만 관련 이 있 습 니 다.
finalize () 의 함수 용도: 1. 대상 을 만 드 는 방식 이외 의 방식 으로 대상 에 게 메모 리 를 할당 합 니 다. 예 를 들 어 로 컬 방법 (자바 에서 비 자바 코드 를 사용 하 는 방식). 2. 대상 종료 조건 의 검증: finalize () 방법 이 항상 호출 되 지 는 않 지만, 어떤 finalize () 는 최종 적 으로 의외 의 결함 을 발견 할 수 있 습 니 다.
class Book {
boolean checkedOut = false;
Book(boolean checkOut) {
checkedOut = checkOut;
}
void checkIn() {
checkedOut = false;
}
protected void finalize() {
if(checkedOut)
System.out.println("Error: checked out");
// Normally, you'll also do this:
// super.finalize(); // Call the base-class version
}
}
public class TerminationCondition {
public static void main(String[] args) {
Book novel = new Book(true);
// Proper cleanup:
novel.checkIn();
// Drop the reference, forget to clean up:
new Book(true);
// Force garbage collection & finalization:
System.gc();//
}
} /* Output:
Error: checked out
*///:~
이 사례 의 종결 조건 은 모든 북 대상 이 쓰레기 로 회수 되 기 전에 check in 에 서명 해 야 하지만 main () 에서 한 권 의 책 이 서명 되 지 않 았 고 finalize () 를 통 해 종결 조건 을 검증 하여 결함 을 발견 하 는 것 이다.
3. 초기 화
1. 멤버 들 은 기본 형식 정 의 를 초기 화 하 는 동시에 초기 화 합 니 다. 초기 화 되 지 않 으 면 자바 규칙 에 따라 기본 값 으로 초기 화 합 니 다. 기본 값 이 아 닌 대상 도 같은 방식 으로 초기 화 할 수 있 습 니 다.
public class InitialValues2 {
boolean bool = true;
char ch = 'x';
byte b = 47;
short s = 0xff;
int i = 999;
long lng = 1;
float f = 3.14f;
double d = 3.14159;
} ///:~
//
class Depth {}
public class Measurement {
Depth d = new Depth();
// ...
} ///:~
어떤 방법 으로 초기 값 을 제공 합 니 다. 매개 변 수 를 가 진 방법 으로 초기 값 을 초기 화 할 수도 있 지만, 이 매개 변 수 는 초기 화 되 어야 합 니 다.
public class MethodInit {
int i = f();
int f() { return 11; }
} ///:~
public class MethodInit2 {
int i = f();
int j = g(i);
int f() { return 11; }
int g(int n) { return n * 10; }
} ///:~
2. 구조 기 초기 화 는 자동 초기 화 를 막 을 수 없습니다. 그 는 구조 기 가 호출 되 기 전에 발생 합 니 다. 클래스 내부 에서 변수 정의 의 우선 순위 가 초기 화 순 서 를 결정 합 니 다. 변수 가 방법 정의 사이 에 흩 어 져 있어 도 모든 방법 (구조 기 포함) 이 호출 되 기 전에 초기 화 됩 니 다.
class Window {
Window(int marker) { System.out.println("Window(" + marker + ")"); }
}
class House {
Window w1 = new Window(1); // Before constructor
House() {
// Show that we're in the constructor:
System.out.println("House()");
w3 = new Window(33); // Reinitialize w3
}
Window w2 = new Window(2); // After constructor
void f() { System.out.println("f()"); }
Window w3 = new Window(3); // At end
}
public class OrderOfInitialization {
public static void main(String[] args) {
House h = new House();
h.f(); // Shows that construction is done
}
} /* Output:
Window(1)
Window(2)
Window(3)
House()
Window(33)
f()
*///:~
정적 데이터 초기 화: 초기 화 순 서 는 정적 대상 을 초기 화 한 다음 비 정적 대상 을 초기 화 하 는 것 입 니 다. 정적 대상 은 전체 과정 에서 한 번 만 초기 화 합 니 다.
class Bowl {
Bowl(int marker) {
System.out.println("Bowl(" + marker + ")");
}
void f1(int marker) {
System.out.println("f1(" + marker + ")");
}
}
class Table {
static Bowl bowl1 = new Bowl(1);
Table() {
System.out.println("Table()");
bowl2.f1(1);
}
void f2(int marker) {
System.out.println("f2(" + marker + ")");
}
static Bowl bowl2 = new Bowl(2);
}
class Cupboard {
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
Cupboard() {
System.out.println("Cupboard()");
bowl4.f1(2);
}
void f3(int marker) {
System.out.println("f3(" + marker + ")");
}
static Bowl bowl5 = new Bowl(5);
}
public class StaticInitialization {
public static void main(String[] args) {
System.out.println("Creating new Cupboard() in main");
new Cupboard();
System.out.println("Creating new Cupboard() in main");
new Cupboard();
table.f2(1);
cupboard.f3(1);
}
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
} /* Output:
Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(1)
*///:~
정적 초기 화
class Cups {
static Cup cup1;
static Cup cup2;
static {
cup1 = new Cup(1);
cup2 = new Cup(2);
}
비 정적 인 스 턴 스 초기 화
public class Mugs {
Mug mug1;
Mug mug2;
{
mug1 = new Mug(1);
mug2 = new Mug(2);
System.out.println("mug1 & mug2 initialized");
}
『 8194 』 3. 배열 초기 화 배열 은 같은 유형 일 뿐, 하나의 식별 자 로 포 장 된 대상 시퀀스 나 기본 형식의 데이터 시퀀스 입 니 다. 이렇게 초기 화 할 수 있 습 니 다.
int [] a={1,2,3,4,5};
int [] a=new int [rand.nextInt(20)];
Integer [] a={new Integer(1),new Integer[2],3,};
가 변 매개 변수 목록: 매개 변수 개수 와 유형 이 알 수 없 는 상황 을 처리 하 는 데 사 용 됩 니 다.
public class NewVarArgs {
static void printArray(Object... args) {
for(Object obj : args)
System.out.print(obj + " ");
System.out.println();
}
public static void main(String[] args) {
// Can take individual elements:
printArray(new Integer(47), new Float(3.14),
new Double(11.11));
printArray(47, 3.14F, 11.11);
printArray("one", "two", "three");
printArray(new A(), new A(), new A());
// Or an array:
printArray((Object[])new Integer[]{ 1, 2, 3, 4 });
printArray(); // Empty list is OK
}
} /* Output: (75% match)
47 3.14 11.11
47 3.14 11.11
one two three
A@1bab50a A@c3c749 A@150bd4d
1 2 3 4
*///:~
4. 매 거 진 형식 (enum): switch 구문 에 특히 적합 합 니 다. 매 거 진 변 수 는 대문자 로 써 야 합 니 다. 매 거 진 을 사용 하면 이 유형의 인용 을 만 들 고 인 스 턴 스 를 부여 합 니 다.