Java : 객체 생성 및 초기화 프로세스
1. 자바의 데이터 유형
Java에는 3 가지 데이터 유형이 있습니다. 기본 데이터 유형 (Java, Boolean, Byte, Short, Int, Long, Char, Float 및 Double은 기본 데이터 유형), 참조 유형 및 NULL 유형입니다. 그중에서도 참조 유형에는 클래스 유형 (배열 포함) 및 인터페이스 유형이 포함됩니다.
다음 진술은 일부 변수를 선언합니다.
int k; a a; // a는 데이터 유형의 객체 변수 이름입니다. B B1, B2,…, B10000; // B가 추상 클래스 또는 인터페이스라고 가정합니다. 문자열 s;
참고 : 데이터 유형 및 변수의 관점에서, 기본 데이터 유형 변수 k, 클래스 유형 변수 a 및 s, 초록 클래스 또는 인터페이스 유형 변수 b (10,000)는 모든 변수 (식별자)입니다.
2. 손잡이에 대해
참조 유형의 변수 식별자와 기본 데이터 유형의 변수 식별자를 구별하기 위해 핸들을 사용하여 참조 유형의 변수 식별자 이름을 지정합니다. 위의 예에서, B1 ~ B10000, A 및 S는 모두 손잡이입니다. 손잡이는 손잡이와 손잡이를 직관적으로 봅니다. 우리는 컴퓨터 세계에서 일반적으로 사용되는 중국어 "핸들"번역을 사용합니다.
2.1 [Windows 프로그래밍에서] 핸들의 의미는 응용 프로그램에서 생성하거나 사용하는 객체를 식별하기 위해 Wallows가 사용하는 고유 한 정수입니다. Windows는 다양한 핸들을 사용하여 응용 프로그램 인스턴스, Windows, 컨트롤, 비트 맵, GDI 객체 등과 같은 식별합니다. Windows 핸들은 C 언어의 파일 핸들과 비슷합니다.
위의 정의에서 핸들이 객체 또는 프로젝트를 식별하는 데 사용되는 식별자임을 알 수 있습니다. 그것은 우리 이름과 같습니다. 모두가 하나를 가질 것입니다. 다른 사람들의 이름은 다른 이름을 가지고 있지만 당신과 같은 이름을 가진 사람도있을 수도 있습니다. 데이터 유형에서, 그것은 단지 16 비트 서명되지 않은 정수 일뿐입니다. 응용 프로그램은 거의 항상 Windows 함수를 호출하여 핸들을 얻는 다음 다른 Windows 기능에서 해당 객체를 참조하기 위해 사용할 수 있습니다.
손잡이를 더 철저히 알고 싶다면 핸들이 포인터에 대한 포인터라고 말할 수 있습니다. 우리는 소위 포인터가 메모리 주소라는 것을 알고 있습니다. 응용 프로그램이 시작된 후 프로그램을 구성하는 객체는 메모리에 있습니다. 우리가 단순히 그것을 이해한다면,이 메모리의 첫 번째 주소를 알고있는 한,이 주소를 사용하여 언제든지 객체에 액세스 할 수 있습니다. 그러나 당신이 정말로 그렇게 생각한다면, 당신은 매우 틀 렸습니다. Windows는 가상 메모리 기반 운영 체제라는 것을 알고 있습니다. 이 시스템 환경에서 Windows 메모리 관리자는 종종 다양한 응용 프로그램의 메모리 요구를 충족시키기 위해 메모리에서 객체를 앞뒤로 움직입니다. 객체가 이동하면 주소가 변경되었음을 의미합니다. 주소가 항상 이렇게 변경되면 객체는 어디에서 찾아야합니까?
이 문제를 해결하기 위해 Windows 운영 체제는 각 응용 프로그램의 일부 내부 스토리지 주소를 사용하여 각 응용 프로그램 객체의 주소 변경 사항을 메모리에 등록 하며이 주소 (저장 장치의 위치) 자체는 변경되지 않았습니다. 객체의 위치를 메모리로 이동 한 후 Windows 메모리 관리자는 객체의 새 주소를 저장하도록 지시합니다. 이런 식으로, 우리는 객체의 메모리가 어디에 있는지 간접적으로 알기 위해이 핸들 주소 만 기억하면됩니다. 이 주소는 객체가로드 (로드) 될 때 시스템에 의해 지정되며 시스템이 언로드 될 때 시스템에 해제됩니다.
주소 처리 (안정) → 메모리에있는 객체 주소를 기록합니다 UNMEMARY의 객체의 주소 (불안정) → 실제 객체
2.2 Java의 핸들의 의미는 [Windows 프로그래밍에서] 핸들의 의미를 깊이 이해하고 있습니다. 우리는 손잡이가 Java를 배울 때 매우 많이 필요한 용어라고 말할 수 있습니다. 그 의미는 "객체 자체"를 객체 변수 (또는 엄격함 : 객체가 속한 데이터 유형의 변수 식별자)와 구별하는 것입니다.
2.3 1의 변수 선언으로 돌아갑니다.
이제 아래 의견을 명확하게 볼 수 있어야합니다.
int k, j; // k는 정수 번호를 저장합니다. A A; // 주소는 a에 저장됩니다. B B1, B2,…, B10000; // B1,…, B10000은 주소를 내부에 저장합니다. 문자열 s; // 주소를 저장합니다.
3. 참조에 대해
"인용"이란 무엇입니까? "조작하는 식별자는 실제로 객체에 대한 '참조'입니다. (Java 2e에서의 생각)
번역은 다음과 같습니다. 조작하는 식별자는 실제로 객체에 대한 "참조"입니다. 또는보다 정확하게, 번역 된 다음 : 작동하는 식별자는 실제로 객체에 대한 "참조"입니다. 분명히, 원본 텍스트의 참조는 방향 감각을 가진 것입니다.
Java로 돌아가서 객체의 ID 번호, 객체의 ID 또는 객체의 휴대 전화 번호를 참조하십시오. 물론, 더 많은 말은 참조가 객체가 메모리에 사는 방 번호라는 것입니다. 직관적으로 말하면, 객체에 대한 참조는 객체를 만들 때의 반환 값입니다! 참조는 새 표현식의 반환 값입니다.
새로운 a (); 다음은 개체가 있지만 핸들을 사용하여 참조를 고정 (고정, 고정, 저장)하지 않습니다. 미세한 관점에서, 새로운 표현식은 객체 초기화 작업 (3 단계, 자세한 분석)을 완료하고 전반적으로 참조를 반환합니다.
변수 선언으로 다시 1의 변수 선언으로 돌아가서 아래의 의견을 살펴보십시오.
A A; // a 핸들을 선언하지만 초기화되지 않았으므로 내부의 값은 null입니다. B B1, B2,…, B10000; // 핸들 B1,…, B10000을 선언하지만 초기화되지 않았으므로 내부의 값은 NULL입니다. 문자열 s; // 핸들을 선언하지만 초기화되지 않았으므로 내부의 값은 null입니다.
4. 핸들과 기준의 관계
a a; // 핸들 a, 값은 nulla = new a (); // 핸들의 초기화입니다 (핸들 = 참조; 즉, 핸들에 대한 참조를 할당).
인용문 : 새로운 a ()의 가치. 참고 문헌은 객체가 메모리 공간을 차지하는 주소로 간단하게 간주 할 수 있습니다. 객체에 대한 참조를 통해 다른 객체와 편리하게 구별 될 수 있으며, 참조는 객체의 고유 한 신분입니다.
핸들이 초기화되면 핸들을 사용하여 원격으로 객체를 제어 할 수 있습니다.
물론 이것은 단지 한 측면에서 객체의 생성과 초기화를 설명하기위한 것입니다. 핸들과 참조 사이의 관계를 이해 한 후에는 객체 초기화의 전체 프로세스가 아래에 분석됩니다. 먼저 다음 준비를하고 스택과 스택에 대해 이야기합시다.
5. 자바에 스택과 힙
Java에서 메모리는 "스택"과 "힙"(스택 및 힙)의 두 가지 유형으로 나뉩니다. 기본 데이터 유형은 "스택"에 저장되며 객체 참조 유형은 실제로 "힙"에 저장되며 참조 메모리의 주소 값은 스택에만 유지됩니다.
그건 그렇고, "=="및 "equals () 메소드"에 대해 이야기하여 (스택과 힙)의 개념을 이해하는 데 도움이됩니다.
변수를 Java에서 "=="과 비교할 때, 시스템은 스택의 변수에 저장된 값을 비교의 기초로 사용합니다. 스택의 기본 데이터 유형에 저장된 값은 격리 값이며 스택의 참조 유형에 저장된 값은 객체 자체의 주소 값입니다. java.lang 패키지의 객체 클래스에는 공개 부울 평등 (Object OBJ) 메소드가 있습니다. 두 객체가 동일한지 비교합니다. 객체의 equals () 메소드는 두 참조가 동일한 객체를 가리키는 경우에만 true를 반환합니다 (핸들이 같음). (문자열 클래스의 equals () 메소드는 equals () 메소드를 무시 하고이 기사에서 논의되지 않습니다.)
6. 객체 생성 및 초기화 프로세스
Java에서 객체는 클래스의 인스턴스입니다. 일반적으로 클래스의 인스턴스화가 발생하면 변수 및 방법을 포함한 해당 클래스의 모든 구성원 이이 데이터 유형의 새로운 인스턴스로 복사됩니다. 다음 두 코드를 분석하십시오.
6.1 Vehicle Veh1 = 새로운 차량 ();
위의 진술은 다음을 수행합니다.
Ormal 오른쪽의 "새 차량"은 차량 클래스를 템플릿으로 사용하여 힙 공간에서 차량 클래스 객체 (차량 객체라고도 함)를 생성합니다.
(()의 끝은 객체가 생성 된 후 차량 클래스의 생성자가 즉시 호출되어 새로 생성 된 객체를 초기화 함을 의미합니다. 생성자가 있어야합니다. 생성되지 않으면 Java는 기본 생성자를 추가합니다.
③ 왼쪽의 "Vehicle Veh1"은 차량 클래스 참조 변수를 만듭니다.
""= "연산자는 객체 참조를 방금 생성 한 차량 객체의 포인트로 만듭니다. (리콜 핸들 및 참조)
위의 진술을 두 단계로 나눕니다.
차량 veh1; veh1 = 새로운 차량 ();
이런 식으로 쓰는 것이 더 명확합니다. 두 가지 엔티티가 있습니다. 하나는 객체 참조 변수이고 다른 하나는 객체 자체입니다. 힙 공간에서 생성 된 엔티티는 스택 공간에서 생성 된 엔티티와 다릅니다. 그것들은 존재하는 실체이지만 정확하게 "잡기"는 어렵습니다. 두 번째 문장을주의 깊게 연구하고 방금 만든 객체의 이름이 무엇인지 알아 봅시다. 어떤 사람들은 그것이 "차량"이라고합니다. 아니요, "차량"은 클래스의 이름입니다 (객체의 생성 템플릿). 차량 클래스는 이에 따라 수많은 객체를 만들 수 있으며 이러한 객체를 "차량"이라고 할 수 없습니다. 객체에는 이름이 없으므로 직접 액세스 할 수 없습니다. 객체 참조를 통해 간접적으로 객체에 액세스 할 수 있습니다.
6.2 차량 차량;
veh2 = veh1;
Veh1과 Veh2는 객체에 대한 참조 일 뿐이므로 두 번째 줄은 Veh1의 기준 (주소)을 Veh2에 할당하는 것입니다.
6.3 VEH2 = 새로운 차량 ();
기준 변수 veh2는 대신 두 번째 객체를 가리 킵니다.
위의 진술에서 추론하면 다음과 같은 결론을 도출 할 수 있습니다. ② 객체는 N 참조를 가리킬 수 있습니다.
Java : 데이터 유형 변환
1. 간단한 유형의 Java 및 캡슐화기 클래스
1.1 Java 간단한 유형 및 캡슐화 클래스 우리는 Java 언어가 전형적인 객체 지향 프로그래밍 언어이지만, 일부 기본 데이터 유형의 구조, 작은 메모리 및 빠른 액세스 속도의 장점을 고려할 때 Java는 여전히 이러한 비 객체 지향 간단한 데이터 유형을 지원합니다. 물론 Java가 많은 다른 클래스를 제공 할 때 간단한 데이터 유형에 해당하는 캡슐화 된 클래스도 제공합니다. 따라서 Java는 int 및 Integer (플로트 및 플로트, 더블 및 더블 ...)와 같은 다른 데이터 유형을 가지고 있습니다.
Java 언어에는 두 가지 주요 데이터 유형이 있습니다. 하나는 기본 유형 (원시)이라고도하는 간단한 유형이고 다른 하나는 참조 유형 (참조)입니다. 간단한 유형 변수는 특정 값을 저장하는 반면 참조 유형 변수는 객체에 대한 참조를 저장합니다.
Java는 각 간단한 유형의 크기를 결정합니다. 이 크기는 기계 구조의 변화에 따라 변하지 않습니다. 이 크기는 변하지 않으며, 이는 Java 프로그램이 강한 휴대 성을 갖는 이유 중 하나입니다.
다음 표는 간단한 유형, 이진 비트의 점유 및 Java로 정의 된 해당 캡슐화 자 클래스를 나열합니다.
테이블 자바의 간단한 유형
1.2 캡슐화 클래스를 사용하는 이유. INT와 Integer를 예로 들어보십시오. 그것들은 본질적으로 32 비트 정수를 나타내지 만 데이터 유형이 다릅니다. 실제로, Java에서 직접 사용되는 정수는 int입니다 (int 및 integer에 관한 한). 데이터가 객체의 ID로 나타나야하는 경우에만 정수 값을 캡슐화 자 정수 인 해당 int와 함께 객체로 캡슐화해야합니다.
예를 들어 : java.util 패키지의 벡터에 정수를 추가하려면 정수 값을 다음과 같이 정수 인스턴스에 캡슐화해야합니다.
벡터 v = 새로운 벡터 (); int k = 121; v.addelemt (new Integer (k));
또한 Integer는 Int에 해당하는 캡슐화기 클래스와 같은 Integer Construction 방법, Int 유형 데이터에서 사용할 수없는 다른 숫자 유형으로의 정수 변환 방법과 같은 많은 방법을 제공합니다.
2. 자바의 상수
우리는 다음 유형의 상수에주의를 기울여야합니다.
2.1 16 진수 정수 상수가 16 진수로 표현되면 0xff, 0x9a와 같은 0x 또는 0x로 시작해야합니다.
2.2 Octal Integer Constant Octal은 0123, 034와 같은 0으로 시작해야합니다.
2.3 긴 유형의 긴 타입은 9L, 342L과 같은 L로 끝나야합니다.
2.4 플로트 상수는 소수점 상수의 기본 유형이 이중 유형이므로 플로트 유형 후에 F (f)를 추가해야합니다. 소수의 변수는 기본적으로 이중 유형입니다.
플로트 F;
f = 1.3f; // f는 선언되어야합니다.
2.5 문자 상수 문자 상수는 두 개의 단일 따옴표로 둘러싸여 있어야합니다 (문자열 상수는 두 개의 이중 인용문으로 둘러싸여 있음). Java의 문자는 2 바이트를 차지합니다.
일반적으로 사용되는 탈출 문자.
①/r은 키보드 입력을 수락하는 것을 의미하며, 이는 Enter 키를 누르는 것과 같습니다.
②/n은 Newline을 의미합니다.
③/t는 탭 문자를 나타내며 테이블 키와 동일합니다.
④/b는 백 스페이스 키를 나타내며, 이는 백 스페이스 키와 동일합니다.
⑤/'는 단일 따옴표를 의미합니다.
⑥/''는 이중 인용문을 의미합니다.
⑦ // 슬래시/를 의미합니다.
3. 간단한 데이터 유형 사이의 변환
간단한 유형의 데이터간에 변환하는 두 가지 방법이 있습니다 : 자동 변환 및 캐스트 변환은 일반적으로 표현식 또는 방법의 매개 변수가 전달 될 때 발생합니다.
3.1 자동 변환 특히 "작은"데이터가 "큰"데이터와 함께 계산되면 시스템은 "작은"데이터를 "큰"데이터로 자동 변환 한 다음 계산을 수행합니다. 메소드를 호출 할 때 실제 매개 변수는 "소형"이며 호출 된 메소드의 공식 매개 변수 데이터는 "대형"입니다 (일치하는 경우 일치하는 메소드가 직접 호출됩니다) 시스템은 "작은"데이터를 "큰"데이터로 자동 변환 한 다음 메소드를 호출합니다. 당연히 동일한 이름의 여러 과부하 메소드의 경우 "닫기" "큰"데이터로 변환되어 호출됩니다.
"작은"에서 "big"까지의 이러한 유형은 (바이트, 짧은, char)-int-long-float-double입니다. 우리가 여기서 말하는 것은 점유 된 바이트 수가 아니라 값을 나타내는 범위의 크기를 나타냅니다.
다음 예를 참조하십시오.
hever 다음 진술은 Java에서 직접 통과 할 수 있습니다.
바이트 b; int i = b; long l = b; float f = b; double d = b;
∎ 저급 유형이 Char 유형 인 경우, 예를 들어 높은 수준 유형 (적분 유형)으로 변환 할 때 해당 ASCII 코드 값으로 변환됩니다.
char c = 'c'; int i = c; System.out.println ( "출력 :"+i);
산출:
출력 : 99;
short 세 가지 유형의 바이트, 짧은 및 문자의 경우 수평이므로 자동으로 서로 변환 할 수 없습니다. 다음 캐스트 유형 변환을 사용할 수 있습니다.
짧은 i = 99; char c = (char) i; system.out.println ( "출력 :"+c);
산출:
출력 : C;
객체 다형성에 방법이 있다면 :
f (byte x) {…}; f (짧은 x) {…}; f (int x) {…}; f (long x) {…}; f (float x) {…}; f (double x) {…}; f (double x) {…}; 또한 char y = 'a'; 그렇다면 문의 F (Y)는 어떤 방법을 호출합니까? 대답은 다음과 같습니다. f (int x) {...} 메소드는 공식 참조 매개 변수가 "대형"이고 "가장 가까운"이기 때문입니다.
그리고 방법을 위해 :
f (float x) {…}; f (double x) {…}; 또한 : 긴 y = 123L; 그런 다음 문자 f (y)에 의해 불리는 메소드는 f (float x) {…}입니다.
3.2 캐스팅 "대형"데이터를 "작은"데이터로 변환 할 때 캐스팅을 사용할 수 있습니다. 즉, 다음 명령문 형식을 사용해야합니다.
int n = (int) 3.14159/2;
당신이 상상할 수 있듯이,이 전환은 확실히 넘어 지거나 정확도가 감소 할 수 있습니다.
3.3 표현식의 데이터 유형을 자동으로 향상시킵니다. 유형의 자동 향상과 관련하여 다음 규칙에주의하십시오.
byte, short 및 char 유형의 모든 값은 int 유형으로 홍보됩니다.
gong 긴 피연산자가 있다면 계산 결과가 길다.
float 플로트 유형 인 피연산자가 있으면 계산 결과는 플로트 유형입니다.
double 이중 유형 인 피연산자가 있으면 계산 결과는 이중 유형입니다.
예,
바이트 B; b = 3; b = (byte) (b*3); // byte를 선언해야합니다.
3.4 패키징 클래스의 전환 유형 변환 일반적으로 말하면, 먼저 변수를 선언 한 다음 해당 포장 클래스를 생성하고 포장 클래스의 다양한 방법을 사용하여 유형 변환을 수행 할 수 있습니다. 예를 들어:
float float를 이중 유형으로 변환하려는 경우 :
float f1 = 100.00f; float f1 = 새로운 float (f1); double d1 = f1.doublevalue (); // f1.doublevalue ()는 플로트 클래스의 이중 값 유형을 반환하는 방법입니다.
double 이중 유형을 int 유형으로 변환 할 때 :
Double D1 = 100.00; Double D1 = New Double (D1); int i1 = d1.intValue ();
간단한 유형의 변수를 해당 래퍼 클래스로 변환하면 래퍼 클래스의 생성자를 사용할 수 있습니다. 즉, 부울 (부울 값), 문자 (char 값), 정수 (int 값), 긴 값 (긴 값), 플로트 (플로트 값), 이중 (이중 값)
각 패키징 클래스에는 항상 해당 단순 유형 데이터를 얻기위한 × 값 () 방법이 있습니다. 이 방법을 사용하면 다른 수치 변수 간의 변환도 실현 될 수 있습니다. 예를 들어, Double-Precision Real-Type 클래스의 경우 intvalue ()는 해당 정수 변수를 얻을 수 있고 DoubleValue ()는 해당 이중 프레시션 실수 유형 변수를 얻을 수 있습니다.
4. 문자열과 다른 유형 사이의 변환
4.1 다른 유형을 문자열로 변환 ① 클래스의 문자열 변환 방법을 호출합니다. x.toString ();
율 : 자극 변환 : x+";
string 문자열을 사용한 메소드 : String.volueof (x);
4.2 문자열을 값으로 다른 유형으로 변환 ① 먼저 해당 래퍼 인스턴스로 변환 한 다음 해당 메소드를 호출하여 다른 유형으로 변환합니다. 예를 들어, 문자에서 "32.1"의 이중 유형 값을 변환하는 형식은 다음과 같습니다. new float ( "32.1"). doublevalue (). 또한 사용할 수 있습니다 : double.valueof ( "32.1"). doublevalue ()
static 정적 parsexxx 방법
문자열 s = "1"; byte b = byte.parsebyte (s); short t = short.parseshort (s); int i = integer.parseint (s); long l = long.parselong (s); float f = float.parsefloat (s); double d = double.parsedouble (s);
③ 문자의 getNumericValue (char ch) 메소드는 API에서 찾을 수 있습니다.
5. 날짜 클래스 및 기타 데이터 유형의 변환
정수와 날짜 클래스간에 직접적인 서신은 없지만 int 유형을 사용하여 연도, 월, 주일, 시간, 분 및 초를 각각 표현하여 각각 두 가지 사이에 서신이 설정됩니다. 이 변환을 수행 할 때는 날짜 클래스 생성자의 세 가지 형태를 사용할 수 있습니다.
int 유형은 연도, 월, int 날짜를 나타냅니다 (연도, 월, int 날짜, int hrs, int hrs, int min) : int 유형은 연도, 월, 일, 시간, 시간 및 미세 ③date (int 연도, int month, int hrs, int min, int sec)를 나타냅니다. 클래스, 즉 시간은 1970 년 1 월 1 일에 0:00:00에서 밀리 초의 수로 표현됩니다.이 서신의 경우 날짜 클래스에는 해당 생성자 : 날짜 (긴 날짜)도 있습니다.
날짜 수업에서 연도, 월, 일, 시간, 분, 두 번째 및 주를 받으십시오. getyear (), getMonth (), getDate (), gethours (), getMinutes (), getEconds (), getDay ()를 사용할 수 있으며 날짜 클래스를 int로 변환하는 것으로 이해할 수도 있습니다.
날짜 클래스의 gettime () 메소드는 앞에서 언급 한 시간에 해당하는 긴 정수 번호를 얻을 수 있습니다. 래퍼 클래스와 마찬가지로 날짜 클래스에는 문자열 클래스로 변환 할 수있는 toString () 메소드도 있습니다.
때로는 특정 날짜 형식 (예 : 20020324)을 얻기를 원합니다. 다음 방법을 사용하여 먼저 파일 시작시 소개 할 수 있습니다.
import java.text.simpledateformat; import java.util.*; java.util.date date = new java.util.date (); // yyyymmdd simpledateformat의 형식을 얻으려면 sy1 = new simpledateformat ( "yyyymmdd"); 문자열 dateformat = sy1.format (date); // 1 년, 월, 일, day, simpledateformat sy = new simpledateformat ( "yyyyy")를 얻으려면; simpledateformat sm = new simpledateformat ( "mm"); simpledateformat sd = new simpledateformat ( "dd"); 문자열 syear = sy.format (날짜); 문자열 smon = sm.format (날짜); 문자열 sday = sd.format (date);