>  기사  >  Java  >  Java 변수 및 객체의 범위에 대한 자세한 설명(그림 및 텍스트)

Java 변수 및 객체의 범위에 대한 자세한 설명(그림 및 텍스트)

黄舟
黄舟원래의
2017-03-29 11:01:482346검색

이 글에서는 주로 Java 변수와 객체의 범위에 대한 관련 지식을 소개합니다. 참조값이 매우 좋은데, 아래 에디터로 살펴보겠습니다

대부분의 프로그래밍 언어는 '스코프'라는 개념을 제공합니다.

범위에 정의된 이름의 경우 범위는 "가시성"과 "존재 시간"을 모두 결정합니다. C, C++ 및 Java에서는 중괄호의 위치에 따라 범위가 결정됩니다.

변수 범위

예:

{
  int x = 12;
  /* only x available */
  {
    int q = 96;
    /* both x & q available */
  }
  /* only x available */
  /* q “out of scope” */
}

Java는 중괄호 쌍을 명령문 블록의 범위로 사용합니다. For 범위라고 하며 범위에 정의된 변수이므로 해당 범위가 끝나기 전에만 사용할 수 있습니다.

Java에서는 다음과 같은 코드를 작성할 수 없습니다.

 {
   int x = 12;
   {
     int x = 96; /* illegal */
   }
 }

Java 컴파일러는 변수가 정의된 것으로 간주하므로 범위 내의 변수를 반복적으로 정의할 수 없지만 C 및 C++ 더 넓은 범위에서 변수를 "숨기는" 것은 C와 C++에서는 허용되지만 Java에서는 허용되지 않습니다. 왜냐하면 Java 설계자는 그렇게 하면 프로그램이 혼란스러워진다고 믿기 때문입니다.

모두가 효과를 볼 수 있도록 두 가지 예를 더 살펴보겠습니다.

1

이 코드를 다시 살펴보겠습니다. 문법 오류가 아닌 행 11번과 12번의 동작은 무엇입니까? 코드는 다음과 같습니다.

위치를 바꾸면 코드는 다음과 같습니다.

범위를 벗어난 후에는 변수에 의해 할당된 메모리 공간이 JVM에 의해 회수되므로 구문 오류가 발생하지 않습니다. 그러나 이름을 쓰는 두 번째 방법은 {} 범위를 벗어나지 않습니다. 따라서 구문 오류가 발생합니다.

위 변수는 모두 지역변수인데 전역변수가 있으면 어떻게 될까요? 코드로 얘기하자면, 코드는 다음과 같습니다.

코드를 주의 깊게 관찰하고 생각해보면 변수의 범위에 대해 다음과 같은 결론을 내릴 수 있습니다. 🎜>

in 전역

변수명

과 지역 변수 이름은 동일한 범위 패키지 내에서 동일한 변수 이름을 가질 수 있습니다. 동일한 범위 패키지 내 지역 변수와 지역 변수는 동일한 변수를 가질 수 없습니다. 이름(반복 이름 지정). 변수 사용 시 전역 변수를 사용할지, 지역 변수를 사용할지 지정하지 않으면 기본값은 지역 변수를 초과하는 경우입니다. 자체 범위를 사용하면 JVM에서 유효하지 않게 되고 가비지 수집됩니다. 그런 다음 이 변수의 이름을 바꾸고 최근에 정의된 지역 변수를 사용할 수 있습니다.

객체의 범위

Java 객체는 Zhu 유형과 존재 시간이 동일하지 않습니다. new

키워드를 사용하여 Java 객체를 생성하면 범위를 벗어나게 됩니다. 따라서

 {
   String s = new String("a string");
 } /* 作用域的终点 */
코드를 사용하면 핸들 s, 즉 참조

가 범위 끝에서 사라집니다. 그러나 s가 가리키는 String 개체는 여전히 메모리 공간을 차지합니다. 위 코드에서는 이 개체를 가리키는 유일한 핸들이 범위 경계를 초과했기 때문에 이 개체를 계속 사용할 수 없습니다.

결과적으로 new로 생성된 객체는 원하는 만큼 유지됩니다. 이 프로그래밍

문제는 C와 C++에서 특히 두드러집니다. 가장 큰 문제는 C++에 있습니다. 언어로부터 어떤 도움도 얻을 수 없기 때문에 필요할 때 객체를 사용할 수 있는지 여부를 확신할 수 없습니다. 그리고 가장 귀찮은 점은 C++에서는 작업이 완료되면 개체를 수동으로 지워야 한다는 것입니다.

이런 흥미로운 질문이 떠오릅니다. Java가 객체를 동일하게 유지하도록 허용한다면 어떻게 객체가 메모리를 채우고 결국 프로그램이 "정지"되는 것을 방지할 수 있습니까? C++에서 이 문제는 프로그래머에게 가장 큰 골칫거리입니다. 하지만 자바 이후에는 상황이 달라졌다. Java에는 new로 생성된 모든 개체를 찾고 그 중 더 이상 참조되지 않는 개체를 식별하는 특수 "가비지 수집기"가 있습니다. 그런 다음 해당 유휴 개체가 차지한 메모리를 자동으로 해제하여 새 개체에서 사용할 수 있도록 합니다. 이는 메모리 회수에 대해 전혀 걱정할 필요가 없음을 의미합니다. 간단히 객체를 생성하면 더 이상 필요하지 않게 되면 자동으로 사라집니다. 이렇게 하면 C++의 일반적인 프로그래밍 문제인 프로그래머가 메모리 해제를 잊어버려서 발생하는 "메모리 오버플로"를 방지할 수 있습니다.

위 내용은 Java 변수 및 객체의 범위에 대한 자세한 설명(그림 및 텍스트)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.