java static 메소드 - 비 정적 변수는 정적 컨텍스트에서 참조 할 수 없습니다.





7 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
  }
}
단점 자바 non

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

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 등). ). 이 변수의 범위는 정적 또는 비 정적 메서드가 아니더라도 선언 된 메서드뿐입니다. 그래서 당신은 그 방법 밖에서 그 변수들을 사용할 수 없습니다. 이것이 기본 오류입니다.

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

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




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

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 {
  ...



나는 당신에게 정적 인 것을 설명하려고 노력할 것이다. 우선 모든 정적 변수는 클래스의 특정 인스턴스에 속하지 않습니다. 그들은 수업의 이름으로 인정받습니다. 정적 메소드는 다시 특정 인스턴스에 속하지 않습니다. 그들은 정적 변수에만 액세스 할 수 있습니다. 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);
        }
    }
}



클래스 파일을로드하는 것은 ClassLoader입니다. 우리 자신의 클래스를 작성할 때 어떤 일이 발생하는지 보도록하겠습니다.

예제 1 :

class StaticTest {

      static int a;
      int b;
      int c;
}

이제 우리는 "StaticTest"클래스가 3 개의 fields를 가지고 있다는 것을 알 수 있습니다. 그러나 실제로 b, c 멤버 변수가 존재하지 않습니다. 그러나 왜? 좋아, 보자. 여기서 b, c는 인스턴스 변수입니다. 인스턴스 변수는 객체 생성시 메모리를 가져옵니다. 그래서 여기 b, c는 아직 메모리를 얻지 못하고 있습니다. 그것이 b, c의 존재가없는 이유입니다. 그래서 오직 존재합니다. ClassLoader에는 a에 관한 정보가 하나뿐입니다. ClassLoader 아직 b, c를 인식하지 못합니다. 오브젝트가 아직 인스턴스화되지 않았기 때문입니다.

다른 예를 봅시다 : 예제 2 :

class StaticTest {

      public void display() {
          System.out.println("Static Test");
      }


      public static void main(String []cmd) {

             display();       
      }

}

이제이 코드 컴파일러를 컴파일하려고하면 CE 오류가 발생합니다. CE : 비 정적 메소드 display ()는 정적 컨텍스트에서 참조 될 수 없습니다.

이제 ClassLoader의 경우 다음과 같습니다.

class StaticTest {

      public static void main(String []cmd) {

             display();       
      }

}

예제 2에서 CE 오류는 정적 컨텍스트에서 비 정적 메서드를 호출하기 때문입니다. 따라서 ClassLoader가 컴파일 타임에 메소드 display ()를 인식 할 수 없습니다. 따라서 컴파일 시간 오류가 발생합니다.




이 시도..

public class StaticTest {

    private int count=0;
    public static void main(String args[]) throws IOException {
        StaticTest test = new StaticTest(); //accessing static variable by creating an instance of class
        System.out.println(test.count);
    }       
}

내가 너를 도울 수 있기를 바란다 ..!




Related