2017-01-03 4 views
2

나는 변수는 두 가지 방법으로 분류 될 수 있다는 사실을 알고 : -모든 인스턴스 변수가 함수 외부에 선언 되었습니까?

첫 번째 방법은 범위에 따라 글로벌 및 로컬 변수로 분류하는 것입니다. 변수가 클래스의 인스턴스의 모든 메소드 (예 : 클래스 전체에서 액세스 가능할 때)는 전역 변수라고하며 클래스의 인스턴스에있는 코드 블록 내에서만 액세스 할 수있는 경우 변수가 알려져 있습니다 지역 변수로.

두 번째 방법은이를 클래스/정적 인스턴스/비 정적 변수으로 분류하는 것입니다. 클래스/정적 변수는 클래스에 속하는 변수이며 클래스의 모든 인스턴스에 대해 이러한 변수의 복사본이 하나만 존재하며 공유됩니다. 인스턴스 변수는 클래스의 인스턴스에 속하며 각 인스턴스에 대해 별도의 복사본이 생성되는 변수입니다.

강사는 인스턴스 변수는 함수 외부에서만 선언 할 수 있다고 말합니다. 이게 왜 그렇게? 지역 변수가 인스턴스 변수가 될 수 있습니까?

+0

가'functions' 외부에 선언 ... 자바에서 어떤 기능 만 방법이 없습니다. –

+0

아니요, 그럴 수 없습니다. 그들의 범위는 하나의 선언 된 후에 메소드 내부에서의 사용으로 제한됩니다. 다른 메소드 나 객체에서 액세스 할 수 없습니다. – f1sh

+0

개체에서 호출되는 메서드가 인스턴스 또는 정적 인 경우 해당 메서드의 범위 내에서 선언 된 모든 변수가 해당 인스턴스와 일치합니다. 그러한 변수의 범위는 해당 메서드 호출에만 해당되므로 부적절한 점의 종류. – David

답변

5

변수에 변수가 선언되어 있으면 해당 메소드에 속하는 로컬 변수입니다. 메소드가 종료되면 범위를 벗어납니다. 변수를 인스턴스에 속하게하는 유일한 방법은 클래스 아래에 직접 선언하는 것입니다. 즉, 메소드 외부에 선언하는 것입니다.

편집 : @Yeikel에 의해 제안

여기 샘플입니다 :

그들이하는 방법 내에서 선언하는 경우
public class MyClass { 

    private static int iAmAStaticMember = 1; 

    private int iAmAnInstanceMember; 

    public void someMethod() { 
     int iAmALocalVariables = 4; 
    } 
} 
+3

이 대답을 완료하려면 샘플 코드를 추가해야합니다. – Yeikel

+0

그러나 로컬 변수가 개체의 일부가 아닙니다. – MrAP

+0

@MrAP : 당신이 "객체의 일부"를 어떻게 정의하는지에 대한 의미에 따라 달라집니다. 이 메서드는 인스턴스 메서드이므로 해당 메서드의 범위가 직관적으로 개체의 인스턴스에 연결됩니다. 반면에 값 자체가 스택에 있는지 또는 힙에 있는지 묻는다면 이는 완전히 다른 이야기입니다. 그것은 실제로 변화를 가져 왔습니까? 여기서 물어 보는 것에 더 깊은 목적이 있습니까? – David

1

, 그들은 단지 방법의 범위에 있습니다. 메소드가 실행 된 후, 변수는 소멸됩니다.

public class Something { 

    int j = 0; // j lives as long as the class exists 

    public doSomething() { 
     int i = 0; 
     // i is gone after method run 
    } 
} 
1

전역 변수 만 인스턴스 변수와 정적 변수로 분류 할 수 있습니다. 함수 내부의 변수는 함수에 대해 로컬이며 클래스도 객체도 아닙니다. 인스턴스 변수는 객체에 속하며 정적 변수는 클래스에 속합니다.

1

Java에서 인스턴스, 정적 및 로컬 변수가 있습니다.

정적 변수는 클래스 자체에 속한 클래스 수준 변수이므로 하나의 복사본이 유지 관리되며 모든 클래스/개체에서 사용됩니다. 클래스가 클래스 로더에 의해로드 될 때 활성화되고 클래스가 언로드 될 때 중지됩니다.

인스턴스 변수는 클래스의 인스턴스, 즉 개체에 연결됩니다. 따라서 생성 된 각 객체에 대한 변수 사본이 있습니다. 액세스 한정자를 기반으로 클래스 외부에서의 사용에 대한 제한이 있습니다 (일반적으로 getter 및 setter를 통해 비공개로 액세스 할 수 있음). 인스턴스가 생성되면 가비지 수집기가 객체에 유효/사용 참조가 없다는 것을 알게되면 인스턴스가 생성됩니다.

로컬 변수는 메소드 레벨 변수입니다. 즉, 메소드에 로컬 변수입니다. 이러한 변수는 메서드가 정적 메서드 또는 개체 참조를 통해 호출 될 때 만들어지며 메서드 실행이 완료되면 중단됩니다. 즉 메서드에서 호출자에게 컨트롤을 반환 할 때 생성됩니다.

class Demo { 

    // static variable - can be accessed by any class/object 
    public static int num1 = 1; 

    // instance variable - accessed by all objects of this class; if made private, can use accessor methods to access it 
    public int num2 = 2; 

    // num3 is a local variable (method arguments are also local variables) 
    public void getSum() { 
     int num3 = 3; 
     return num2 + num3; 
    } 

} 

희망이 도움이 :)

관련 문제