[java] 비 정적 변수는 정적 컨텍스트에서 참조 할 수 없습니다.


4 Answers

정적 필드와 메소드는 인스턴스가 아닌 클래스 자체에 연결됩니다. 클래스 A , 'normal'메서드 b 및 정적 메서드 c 가 있고 클래스 A 의 인스턴스를 만들 경우 Ac()ab() 대한 호출이 유효합니다. 방법 c() 는 어떤 인스턴스가 연결되어 있는지 모르기 때문에 비 정적 필드를 사용할 수 없습니다.

해결 방법은 필드를 정적으로 만들거나 메서드를 비 정적으로 만드는 것입니다. 당신은 메인이 다음과 같이 보일 수 있습니다 :

class Programm {
  public static void main(String[] args){
    Programm programm = new Programm();
    programm.start();
  }
  public void start(){
    // can now access non-static fields
  }
}
Question

나는이 테스트 코드를 작성했다.

class MyProgram
{
    int count = 0;
    public static void main(String[] args)
    {
        System.out.println(count);
    }
}

그러나 다음과 같은 오류가 발생합니다.

Main.java:6: error: non-static variable count cannot be referenced from a static context
        System.out.println(count);
                           ^

내 클래스 변수를 인식 할 수있는 방법을 얻으려면 어떻게해야합니까?




먼저 프로그램을 분석해 봅시다. 프로그램에서 첫 번째 메서드는 main() 입니다. 정적 메서드라는 것을 명심하십시오. 그런 다음 해당 메서드의 로컬 변수를 선언합니다 (compareCount, low, high 등). ). 이 변수의 범위는 정적 또는 비 정적 메서드가 아니더라도 선언 된 메서드뿐입니다. 그래서 당신은 그 방법 밖에서 그 변수들을 사용할 수 없습니다. 이것이 기본 오류입니다.

그런 다음 다음 지점으로갑니다. 넌 정적이 너를 죽이고 있다고했다. (그것은 당신을 죽일지도 모르지만 그것은 당신의 프로그램에만 생명을 부여합니다 !!) 우선 기본적인 것을 이해해야합니다. * 정적 메서드는 정적 메서드 만 호출하고 정적 변수 만 사용합니다. * 정적 변수 또는 정적 메소드는 해당 클래스의 인스턴스에 종속되지 않습니다. (즉, 정적 변수의 상태를 변경하면 클래스의 모든 객체에 반영됩니다.) *이 때문에 클래스 변수 또는 클래스 메소드로 호출합니다. 그리고 "정적 인"키워드에 관해 더 많은 것이 있습니다. 나는 당신이 아이디어를 얻길 바랍니다. 먼저 변수의 범위를 변경하고 정적 메소드로 선언하십시오 (정적 메소드에서 사용할 수 있음).

그리고 당신에게 조언은 : 당신은 변수와 정적 기능의 범위에 대한 아이디어를 잘못 이해했습니다. 그것에 대해 명확한 아이디어를 얻으십시오.




나는 당신에게 정적 인 것을 설명하려고 노력할 것이다. 우선 모든 정적 변수는 클래스의 특정 인스턴스에 속하지 않습니다. 그들은 수업의 이름으로 인정받습니다. 정적 메소드는 다시 특정 인스턴스에 속하지 않습니다. 그들은 정적 변수에만 액세스 할 수 있습니다. MyClass.myMethod ()를 호출하고 myMethod를 정적 메서드라고 가정 해 보겠습니다. 메소드 내에서 비 ​​정적 변수를 사용한다면, 어떻게하면 어떤 변수를 사용할 지 알 수 있을까요? 그래서 정적 메소드에서만 정적 변수를 사용할 수 있습니다. 나는 그들이 어떤 특별한 경우에도 속하지 않는다는 것을 다시 반복한다.




이것은 모든 초보자를위한 정적 키워드에 대해 설명하기에 조금 다릅니다.
클래스와 객체로 더 많은 작업을 할 때 명확하게 알게됩니다.

| * | 정적 : 클래스 이름으로 정적 항목을 호출 할 수 있습니다.
코드에서 관찰 할 경우 일부 함수는 클래스 이름과 같이 직접 호출됩니다.

NamCls.NamFnc();

System.out.println();

이것은 NamFnc와 println이 키워드 앞에 static을 사용하여 선언되기 때문입니다.

| * | 비 정적 : 클래스 변수로 비 정적 항목을 호출 할 수 있습니다.
정적이 아니라면 클래스의 변수가 필요합니다.
클래스 변수 뒤에 점을 넣고
그런 다음 함수를 호출하십시오.

NamCls NamObjVar = new NamCls();
NamObjVar.NamFnc();

아래 코드는 당신을 깔끔하게 설명합니다.

| * | 클래스 내의 정적 및 비 정적 함수 :

public class NamCls
{
    public static void main(String[] args)
    {
        PlsPrnFnc("Tst Txt");

        NamCls NamObjVar = new NamCls();
        NamObjVar.PrnFnc("Tst Txt");
    }

    static void PlsPrnFnc(String SrgPsgVal)
    {
        System.out.println(SrgPsgVal);
    }

    void PrnFnc(String SrgPsgVal)
    {
        System.out.println(SrgPsgVal);
    }
}

| * | 클래스 내부의 정적 및 비 정적 클래스 :

public class NamCls
{
    public static void main(String[] args)
    {
        NamTicCls NamTicVaj = new NamTicCls();
        NamTicVaj.PrnFnc("Tst Txt");

        NamCls NamObjVar = new NamCls();
        NamNicCls NamNicVar = NamObjVar.new NamNicCls();
        NamNicVar.PrnFnc("Tst Txt");
    }

    static class NamTicCls
    {
        void PrnFnc(String SrgPsgVal)
        {
            System.out.println(SrgPsgVal);
        }
    }

    class NamNicCls
    {
        void PrnFnc(String SrgPsgVal)
        {
            System.out.println(SrgPsgVal);
        }
    }
}



정적 메서드에서 액세스하려면 정적 멤버 변수가 필요합니다.

public class MyProgram7 {
  static Scanner scan = new Scanner(System.in);
  static int compareCount = 0;
  static int low = 0;
  static int high = 0;
  static int mid = 0;  
  static int key = 0;  
  static Scanner temp;  
  static int[]list;  
  static String menu, outputString;  
  static int option = 1;  
  static boolean found = false;

  public static void main (String[]args) throws IOException {
  ...





Related