이 글은 자바에서 멤버 변수와 로컬 변수의 차이점을 예제를 통해 분석합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.
멤버 변수: 이 클래스에 정의된 전용 변수는 이 클래스에 속합니다.
멤버 변수를 생성하고 사용하여 코드를 복사합니다. public class Person {
문자열 이름;
문자열 섹스;
나이;
이중 높이;
공개 정적 무효 메인(문자열 arges[])
{
사람 p=new 사람();
p.name="샤오황";
p.Sex="남성";
페이지나이=20;
p.높이=1.7;
System.out.println("이름:"+p.name+",Gender"+p.Sex+",Age:"+p.age+",Age:"+p.Height);
}
}
멤버변수 초기화 과정
1. 클래스 초기화
클래스 초기화의 경우: 클래스 초기화는 일반적으로 한 번만 초기화되며, 클래스 초기화는 주로 정적 멤버 변수를 초기화합니다.
클래스의 컴파일에 따라 클래스의 초기화 프로세스가 결정됩니다.
컴파일러가 생성한 클래스 파일은 주로 소스 파일에 정의된 클래스를 다음과 같이 변경합니다.
1) 먼저 정적 멤버변수가 정의된 순서대로 클래스 내부에 멤버변수를 선언합니다.
2) 원래 Java 클래스의 멤버 변수 초기화 순서에 따라 초기화합니다.
Java 클래스와 컴파일된 클래스 간의 해당 변환은 다음과 같습니다.
소스 파일:
다음과 같이 코드를 복사합니다. public class Person{
공개 정적 문자열 이름="장산";
공개 정적 int 연령;
공전{
나이=20;
System.out.println("초기화 기간");
}
공개 정적 문자열 주소;
공전{
주소="베이징";
나이=34;
}
공개 정적 무효 메인(String[] args) {
System.out.println(이름);
System.out.println(age);
System.out.println(주소);
}
}
Java 소스 코드가 클래스 파일로 변환되면 다음과 유사한 코드로 변환됩니다.
다음과 같이 코드를 복사합니다. public class Person{
공개 정적 문자열 이름;
공개 정적 int 연령;
공개 정적 문자열 주소;
공전{
name="장산";
나이=20;
System.out.println("초기화 기간");
주소="베이징";
나이=34;
}
공개 정적 무효 메인(String[] args) {
System.out.println(이름);
System.out.println(age);
System.out.println(주소);
}
}
초기화 순서는 변환 후 해당 클래스 멤버 변수의 초기화 순서에 따라 순차적으로 실행되므로 모든 정적 멤버 변수를 먼저 선언한 후 할당하며, 할당 순서도 정적 멤버 변수가 생성된 순서에 따라 결정됩니다. , 참고: 멤버 변수를 정의하고 직접 초기화하는 것은 소스 코드에 정의된 순서대로 정적 코드 블록에서 초기화하는 것과 같습니다.
지역 변수
지역 변수: 메서드 본문에서 생성된 이 변수는 메서드 본문 외부에서 액세스할 수 없습니다.
지역변수 생성 및 사용(지역변수에는 값을 할당해야 하며, 멤버변수에는 값을 할당하지 않을 수 있음)
다음과 같이 코드를 복사합니다. public class Person {
공개 정적 무효 메인(문자열 arges[])
{
문자열 이름="샤오황";
문자열 성별="남성";
정수 나이=20;
이중 높이=1.70;
System.out.println("이름:"+name+",gender"+Sex+",age:"+age+",age:"+Height);
}
}
예제를 보고 코드를 복사해 보세요. public class PassTest {
공개 정적 무효 메인(문자열 인수[]) {
StringBuffer a = new StringBuffer("a");
StringBuffer b = new StringBuffer("b");
a(a,b);
System.out.println(a);
System.out.println(b);
PassTest p = new PassTest();
pc();
}
정적 무효 a(StringBuffer a, StringBuffer b) {
a = a.append(b);
b=a;
}
}
지역 변수의 사용 범위에 따라 결과는 ab여야 하지만 실제로는 abb로 출력됩니다. 왜일까요?
매개변수 참조를 전달하는 문제입니다. 참조인 경우 전달되는 내용은 동일한 참조의 복사본이어야 합니다.
메서드 a의 b=a는 복사본 b 참조를 =a로 변경하지만 main의 b에는 영향을 주지 않습니다.
a = a.append(b); 주로 a.append(b); 이 문장은 참조가 가리키는 값을 변경합니다. 왜냐하면 main의 a도 동일한 객체를 가리키기 때문입니다. 따라서 출력은 ab b입니다.
a = a.append(b); 가 a = new StringBuffer("ab")로 변경되면 출력됩니다.
다음 두 프로그램을 살펴보세요.
절차 1:
다음과 같이 코드를 복사합니다. public class Variable
{
내가;
무효 테스트()
{
정수 j=8;
if(j==i)
System.out.println("같음");
또 다른
System.out.println("같지 않음");
}
공개 정적 무효 메인(문자열[] 인수)
{
변수 v=new Variable();
v.test();
}
}
절차 2:
다음과 같이 코드를 복사합니다. public class Variable
{
무효 테스트()
{
내가;
정수 j=8;
if(j==i)
System.out.println("같음");
또 다른
System.out.println("같지 않음");
}
공개 정적 무효 메인(문자열[] 인수)
{
변수 v=new Variable();
v.test();
}
}
첫 번째 프로그램은 정상이며 오류 없이 컴파일됩니다. 두 번째 프로그램을 컴파일하면 다음 오류가 표시됩니다.
D:Programjavatest>javac Variable.java
Variable.java:9: 변수 i가 아직 초기화되지 않았을 수 있습니다.
if(j==i)
^
실수
이러한 오류가 발생하는 이유는 멤버 변수에 기본값이 있고(static이 아닌 final로 수정된 값은 명시적으로 할당되어야 함) 로컬 변수가 자동으로 할당되지 않기 때문입니다.
클래스 본문은 두 부분으로 나뉩니다. 변수 정의 부분에 정의된 변수를 클래스의 멤버 변수라 하고, 메소드 본문에 정의된 변수와 메소드의 매개변수를 지역 변수라고 합니다.
지역변수와 멤버변수의 차이점
지역 변수는 메서드 본문의 속성을 설명하고, 멤버 변수는 개체의 속성을 설명합니다.
멤버 변수는 public, protected, default, private, static, final 한정자로 수정할 수 있는 반면, 지역 변수는 final 한정자로만 수정할 수 있습니다.
멤버 변수는 힙에 생성되고, 로컬 변수는 스택에 생성됩니다.
로컬 변수에는 시스템 기본값이 있으며, 시스템 기본값이 없으므로 수동으로 할당해야 합니다.
이 글이 모든 사람의 Java 프로그래밍에 도움이 되기를 바랍니다.