Java의 모든 것은 객체로 간주되며, 연산 객체는 실제로 연산 객체의 "참조"입니다. 둘 사이의 관계는 리모콘(참조)을 사용하여 TV(객체)를 조작하는 것과 같습니다. 참조가 있다고 해서 반드시 개체가 연결될 필요는 없습니다. 예를 들어 참조가 개체와 연결되어 있지 않다고 선언하는 것뿐입니다.
참조를 생성한 후에는 일반적으로 new를 사용하여 새 객체를 생성합니다(Java의 문자열은 인용 텍스트로 초기화될 수 있음).
(1) 등록합니다. 가장 빠른 저장 영역(프로세서 내부에 있음)은 Java에서 사람이 직접 제어할 수 없습니다(c++/c를 사용하면 컴파일러에 레지스터 할당 방법을 제안할 수 있음).
(2) 쌓다. RAM에 있는 스택 포인터는 아래로 이동하여 새 메모리를 할당하고 위로 이동하여 메모리를 해제합니다. 이는 레지스터 다음으로 매우 빠릅니다. 하지만 시스템을 생성할 때 자바 시스템은 포인터를 상하로 움직이기 위해서는 스택에 저장된 모든 항목의 정확한 선언 기간을 알아야 합니다. 이 제약 조건은 프로그램의 유연성을 제한합니다. 일부 기본 유형의 변수 및 개체 참조(Java 개체는 여기에 포함되지 않음)가 스택에 저장됩니다.
(3) 힙. 모든 Java 개체를 저장하는 데 사용되는 일반 메모리 풀(RAM에 위치)입니다. 스택과 달리 힙의 장점은 컴파일러가 힙에 저장된 데이터가 얼마나 오랫동안 유지되는지 알 필요가 없다는 것입니다. 객체가 새로 생성되면 저장을 위해 힙에 메모리가 자동으로 할당됩니다. 컴파일러는 사람의 제어 없이는 더 이상 필요하지 않은 개체를 자동으로 재활용합니다. 물론 이러한 유연성에는 대가가 따릅니다. 즉, 스택에 객체를 생성하는 데 C/C++에서보다 시간이 더 걸립니다.
(4) 지속적인 보관. 상수 값은 절대 변하지 않기 때문에 일반적으로 프로그램 코드 내에 직접 저장됩니다.
(5) RAM이 아닌 저장 장치. 데이터는 프로그램 외부에 존재하며 프로그램의 통제를 받지 않습니다. 스트림 개체 및 영구 개체 등이 있습니다.
정수, 소수, 문자 등 프로그래밍에서 자주 사용되는 일련의 유형... 이러한 유형을 기본 유형이라고 하며 특별하게 취급됩니다.
특별한 치료가 필요한 이유는 무엇인가요? new 는 객체를 힙에 저장합니다. 앞서 언급했듯이 힙에 저장된 데이터는 시간이 더 오래 걸리므로 자주 사용되는, 특히 작고 간단한 데이터의 경우 힙에 저장하는 데 드는 비용이 너무 높습니다. 따라서 Java는 변수를 생성하기 위해 new를 사용하지 않고 참조가 아닌 "자동" 변수를 생성합니다. 이 변수는 값을 직접 저장하고 스택에 배치합니다. 기본형이 차지하는 저장공간은 고정되어 있습니다.
모든 것이 객체라는 사실에 적응하기 위해 기본 유형에는 래퍼 클래스가 있으므로 해당 기본 유형을 나타내는 비기본 객체를 힙에 생성할 수 있습니다.
예:
char c='a'; Character ch=new Character(c); 或者 Character ch=new Character('a');
Java se5의 자동 패키징 기능은 둘 사이를 자동으로 변환할 수 있습니다.
변수 범위: 변수에는 값을 직접 저장하는 기본 유형과 클래스 참조가 포함됩니다. 코드 세그먼트 내에서만 살아남습니다.
객체 범위:
{ String s=new String("string"); }//end of scope
참조 s는 스택에 저장되고 범위의 끝에서 끝납니다. 그러나 s가 가리키는 String 객체는 계속해서 힙에 존재합니다. 객체를 언제 재활용할지 결정하는 것은 Java의 가비지 수집기에 달려 있습니다. 이렇게 하면 대부분의 "메모리 누수" 문제가 제거됩니다.
Java는 c/C++와 다릅니다. 많은 사람들이 Java 메소드 매개변수가 값으로 전달되는지 아니면 참조로 전달되는지 혼란스러워합니다. 기본 데이터 유형의 경우 기본 데이터는 스택 영역에 직접 값을 저장하기 때문에 값이 전달됩니다. 객체는 참조로 전달됩니다(스택 영역의 객체 참조는 힙 영역의 객체 주소입니다). 설명을 위해 String과 StringBuilder를 사용하세요.
아래 두 가지 예를 살펴보세요.
public class Test {public static void test(String str) { str = "world"+str; }public static void main(String[] args) { String str1 = new String("hello"); test(str1); System.out.println(str1); } }
위 예제의 출력 결과는 여전히 hello입니다. 왜일까요? 테스트에서 str에 대한 수정은 원래 객체에 대한 수정이 아니기 때문에 이는 String 객체의 특성과 관련이 있습니다. String 객체는 생성된 후에는 수정할 수 없습니다. 실제로 위의 수정은 빈 StringBuilder를 생성한 다음 호출합니다. 추가 메소드를 사용하여 "world", str을 삽입한 다음 toString 메소드를 호출하여 새 String 객체를 만듭니다. 따라서 str의 참조 개체는 현재로서는 이미 새로운 것이므로 기본 함수의 str1은 변경되지 않았습니다. StringBuilder의 또 다른 예를 살펴보겠습니다.
public class test1 { static void test(StringBuilder str){ str.append("1234"); } public static void main(String[] args) { StringBuilder a=new StringBuilder("abc"); test(a); System.out.println(a.toString()); } }
위의 출력 결과는 abc1234입니다. str과 a의 참조는 동일한 StringBuilder 개체를 가리키고 StringBuilder는 수정 가능하기 때문에 테스트에서 str을 수정하면 a에도 적용됩니다. 통과된 내용은 참고사항이라고만 말하면 충분합니다.
위 내용은 Java의 모든 것은 객체입니다의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!