programing

정적 컨텍스트에서 비 정적 변수를 참조할 수 없습니다.

goodcopy 2022. 8. 2. 23:23
반응형

정적 컨텍스트에서 비 정적 변수를 참조할 수 없습니다.

테스트 코드를 작성했습니다.

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);
                           ^

클래스 변수를 인식하기 위한 메서드는 어떻게 해야 합니까?

클래스와 해당 클래스의 인스턴스의 차이를 이해해야 합니다.길거리에서 차를 보면 어떤 차종인지 알 수 없어도 바로 차임을 알 수 있습니다.이는 여러분이 보는 것을 "자동차" 클래스와 비교하기 때문입니다.그 클래스는 모든 자동차와 비슷한 것을 포함하고 있다.템플릿이나 아이디어로 생각해 주세요.

동시에, 여러분이 보는 자동차는 여러분이 기대하는 모든 특성을 가지고 있기 때문에 "자동차" 클래스의 인스턴스입니다.운전하고 있는 사람이 있어요 엔진과 바퀴가 있어요

그래서 클래스는 "모든 차에는 색깔이 있다"고 말하고 인스턴스에는 "이 특정 차는 빨간색이다"라고 말합니다.

합니다.Color클래스가 인스턴스화되면(특정 인스턴스를 만들 때), 메모리는 색상용으로 예약되며 이 특정 인스턴스에 색상을 지정할 수 있습니다.아트리부트

정적 필드 및 메서드는 모든 인스턴스와 공유됩니다.특정 인스턴스가 아닌 클래스에 고유한 값용입니다.메서드의 방식를 들어 다음과 같습니다.Integer.parseInt()필드의 경우 보통 상수(예: 제한된 집합이 자주 변경되지 않는 차종)입니다.

문제를 해결하려면 클래스의 인스턴스를 인스턴스화(개체 만들기)해야 합니다.이렇게 하지 않으면 런타임에서 해당 인스턴스에 대한 메모리를 예약할 수 있습니다(그렇지 않으면 서로 다른 인스턴스가 덮어쓰게 됩니다).

이 경우 다음 코드를 시작 블록으로 사용해 보십시오.

public static void main (String[] args)
{
    try
    {
        MyProgram7 obj = new MyProgram7 ();
        obj.run (args);
    }
    catch (Exception e)
    {
        e.printStackTrace ();
    }
}

// instance variables here

public void run (String[] args) throws Exception
{
    // put your code here
}

★★★★★main()하지만 method가 포함되었기 때문에).main() 메서드 메서드)를합니다.run()를 참조해 주세요.

정적 필드 및 메서드는 인스턴스가 아닌 클래스 자체에 연결됩니다.A 'normal) , 'normal'(일반 인스턴스라고 불린다)b 방식 " " " " ca A의 콜, 「」A.c() ★★★★★★★★★★★★★★★★★」a.b()방법c()는 어떤 인스턴스가 연결되어 있는지 알 수 없기 때문에 비정적 필드를 사용할 수 없습니다.

해결 방법은 필드를 정적으로 하거나 메서드를 정적으로 하는 것입니다.메인 화면은 다음과 같습니다.

class Programm {

    public static void main(String[] args) {
        Programm programm = new Programm();
        programm.start();
    }

    public void start() {
        // can now access non-static fields
    }
}

static키워드는 클래스 내의 메서드 또는 변수의 라이프 사이클을 변경합니다. a.static메서드 또는 변수는 클래스가 로드될 때 생성됩니다." "로 static된 경우, 예를 클래스가 오브젝트로 됩니다.★★★★★★★★★★★★★★★★★,new환입니니다다

클래스의 라이프 사이클은 대략 다음과 같습니다.

  1. 클래스의 소스 코드는 템플릿, 패턴 또는 스탬프를 만드는 데 사용됩니다.
  2. new를 후
  3. 가비지 수집 중에 메모리와 같이 보유하고 있는 리소스를 회수하는 개체를 삭제합니다.

응용 프로그램의 초기 진입점을 갖기 위해 Java는 Java 프로그램이 합의된 이름 또는 특별한 이름을 가진 메서드를 포함하는 클래스를 가져야 한다는 규칙을 채택했습니다.을 '이 방법'이라고 .main(). 가 main() 메음음음음음 be method method with with를 해야 합니다.static 「」가 , 합니다.main()메서드를 사용할 수 있습니다.

을 명령줄로 어플리케이션이 시작됩니다.java helloworld일련의 행동이 일어납니다.Java Virtual Machine(Java 가상 머신)입니다.음음 、 Java 、 Hellowolld . class 、 Java Virtual Machine 。 다음 Java Virtual Machine에서 .helloworld'클래스'라고 main(String [] args)이 메서드는 다음과 같아야 합니다.static클래스가 실제로 개체로 인스턴스화되지 않았더라도 존재할 수 있도록 합니다.Java Virtual Machine(Java Virtual Machine)은 Java Virtual Machine(Java 가상 머신)을 사용합니다.됩니다.main()★★★★★★ 。

이 수 .staticJava Java에서 시작되면main(), 이 함수는 가 '어리다'인할 수 있습니다.static로드되는 클래스의 일부로 존재하기 때문입니다.

및 는 ,, 이, 이, 이, of, of, of, of, however, however, however, however, however, however, of, however, however, however, however, however, however, of, of 의 변수 및 메서드입니다.main()「」가 static까지 사용할 수 .main()할 수 .오브젝트를 작성한 후 오브젝트의 변수와 메서드를 사용할 수 있습니다.하려고 합니다.와 메서드를 하지 않습니다.static클래스 오브젝트를 경유하지 않는 수식자는 컴파일 시 Java 컴파일러에 의해 포착되어 오류로 플래그가 지정됩니다.

import java.io.*;

class HelloWorld {
    int myInt;      // this is a class variable that is unique to each object
    static int myInt2;  // this is a class variable shared by all objects of this class

    static void main (String [] args) {
        // this is the main entry point for this Java application
        System.out.println ("Hello, World\n");
        myInt2 = 14;    // able to access the static int
        HelloWorld myWorld = new HelloWorld();
        myWorld.myInt = 32;   // able to access non-static through an object
    }
}

먼저 프로그램을 분석하겠습니다.에서는 첫 방법이 '일단'입니다.main()정적인 방법이라는 점에 유의해 주십시오.비교수, 저, 고)이 변수의 범위는 스태틱 방식인지 비 스태틱 방식인지에 관계없이 선언된 방식일 뿐입니다.따라서 이 방법 이외에는 이러한 변수를 사용할 수 없습니다.이것은 당신이 저지른 기본적인 오류입니다.

그럼 다음 포인트로 넘어가죠.잡음이 당신을 죽이고 있다고 말했잖아요. (죽을지도 모르지만 당신의 프로그램에 생기를 불어넣을 뿐입니다!!)우선 기본적인 것을 이해해야 한다.* static 메서드는 static 메서드만 호출하고 static 변수만 사용합니다.* static 변수 또는 static 메서드는 해당 클래스의 인스턴스에 종속되지 않습니다.(즉, 정적 변수의 상태를 변경하면 클래스의 모든 개체에 반영됩니다.) *이 때문에 클래스 변수 또는 클래스 메서드라고 부릅니다.static 키워드에 대해서는 더 많은 것이 있습니다.이제 이해하시길 바랍니다.먼저 변수의 범위를 변경하고 이를 스태틱으로 선언합니다(스태틱 방식에서 사용할 수 있도록 함).

그리고 조언은 변수의 범위와 정적 기능의 개념을 잘못 이해했다는 것입니다.그것에 대해 확실히 이해해라.

스태틱 메서드에서 액세스하려면 다음과 같은 스태틱멤버 변수가 필요합니다.

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

가장 기본적인 것은 정적 변수 또는 정적 메서드가 클래스 수준이라는 것입니다.클래스 수준 변수 또는 메서드는 인스턴스 수준 메서드 또는 변수보다 먼저 로드됩니다.그리고 분명히 적재되지 않은 것은 사용할 수 없습니다.따라서 자바 컴파일러가 실행 시 처리하지 않도록 하면 컴파일 시 해결됩니다.그렇기 때문에 정적 컨텍스트에서는 참조할 수 없는 오류가 발생합니다.Class Level Scope, Instance Level Scope 및 Local Scope에 대해 읽어보기만 하면 됩니다.

이제 메서드에서 인스턴스를 추가/사용할 수 있습니다.

public class Myprogram7 {

  Scanner scan;
  int compareCount = 0;
  int low = 0;
  int high = 0;
  int mid = 0;  
  int key = 0;  
  Scanner temp;  
  int[]list;  
  String menu, outputString;  
  int option = 1;  
  boolean found = false;  

  private void readLine() {

  }

  private void findkey() {

  }

  private void printCount() {

  }
  public static void main(String[] args){

    Myprogram7 myprg=new Myprogram7();
    myprg.readLine();
    myprg.findkey();
    myprg.printCount();
  }
}

저는 당신에게 정적인 것에 대해 설명하겠습니다.우선 정적 변수는 클래스의 특정 인스턴스에 속하지 않습니다.클래스 이름과 함께 인식됩니다.스태틱 메서드는 다시 특정 인스턴스에 속하지 않습니다.정적 변수에만 액세스할 수 있습니다.MyClass.m에 전화한다고 가정해 봅시다.yMethod() 및 myMethod는 정적 메서드입니다.방법 내에서 비정적 변수를 사용하는 경우, 대체 어떤 변수를 사용해야 하는지 어떻게 알 수 있을까요?따라서 정적 메서드에서 정적 변수만 사용할 수 있습니다.반복한다. 그들은 어떤 특정 사례에 속하지 않는다.

  • 첫 번째는 클래스의 인스턴스와 클래스 자체의 차이를 아는 것입니다.클래스는 특정 속성과 이러한 속성의 맥락에서 전체의 동작을 모델링합니다.인스턴스는 이러한 속성의 특정 값을 정의합니다.

  • static 키워드에 바인드된 모든 것은 클래스의 인스턴스가 아닌 클래스의 컨텍스트에서 사용할 수 있습니다.

  • 상기의 결과로서

    1. 메서드 내 변수는 정적일 수 없습니다.
    2. static 필드 및 메서드는 class-name을 사용하여 호출해야 합니다.My Program7.main(...)
  • 정적 필드/메서드의 라이프 타임은 응용 프로그램의 라이프 타임과 동일합니다.

예: 예를 들어, 자동차는 특성 색상을 가지며 '모션' 동작을 나타냅니다.레드 폭스바겐 비틀이 시속 25km로 달리는 것이 그 차일 것이다.

차량의 정적 특성은 도로의 바퀴 수(4개)이며, 이는 모든 차량에 적용됩니다.

HTH

인스턴스 메서드 또는 인스턴스 변수를 호출하기 전에 오브젝트(인스턴스)가 필요합니다.되면 이 알 수.static 변수입니다.정적 메서드에는 개체가 없기 때문입니다(항상 하나의 복사본만). 또는 메서드는 를 합니다.this자체 을 가집니다즉, 변수는 생성된 모든 개체에 속하며 각 개체에는 인스턴스 메서드와 변수의 고유한 복사본이 있습니다.

변수는 '다보다'로 됩니다.static인스턴스 변수에는 특정 키워드가 없습니다.

클래스 파일을 로드하는 것은 ClassLoader입니다.우리가 직접 수업을 쓸 때 어떤 일이 일어나는지 봅시다.

예 1:

class StaticTest {

      static int a;
      int b;
      int c;
}

이제 "Static Test" 클래스에 3개의 필드가 있습니다.하지만 실제로 b,c 멤버 변수는 존재하지 않습니다.하지만 왜? 그래, 어디 보자.여기서 b,c는 인스턴스 변수입니다.인스턴스 변수는 객체 생성 시 메모리를 가져오기 때문입니다.그래서 여기 b,c는 아직 기억을 얻지 못하고 있어그래서 b, c가 존재하지 않는 거야. 그러니까 a만 존재하는 거야.ClassLoader의 경우 에 대한 정보는 1개뿐입니다.ClassLoader는 아직 b,c를 인식하지 않습니다.이는 아직 오브젝트가 인스턴스화되지 않았기 때문입니다.

다른 예를 보겠습니다.예 2:

class StaticTest {

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


      public static void main(String []cmd) {

             display();       
      }

}

이 코드 컴파일러를 컴파일하면 CE 에러가 발생합니다.비정적 메서드 표시()는 정적 컨텍스트에서 참조할 수 없습니다.

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

class StaticTest {

      public static void main(String []cmd) {

             display();       
      }

}

예 2의 CE 오류는 스태틱컨텍스트에서 비 스태틱메서드를 호출했기 때문입니다.따라서 ClassLoader는 컴파일 시 메서드 display()를 인식할 수 없습니다.그래서 컴파일 시간 오류가 발생하였습니다.

이것은 모든 초보자를 위한 정적 키워드에 대해 설명하는 것은 조금 다릅니다.
클래스 및 오브젝트를 더 많이 작업하면 명확하게 알 수 있습니다.

|*| Static : 클래스 이름을 사용하여 스태틱 항목을 호출할 수 있습니다.
는 클래스 됩니다.

NamCls.NamFnc();

System.out.println();

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

|*| Non Static : Non Static 항목을 Class Variable로 호출할 수 있습니다.
않은 합니다.
변수 클래스 변수 뒤에 점을 찍습니다.
기능을 호출합니다.

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


Below code explains you neatly

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

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);
    }
}


|*| Static and non Static Class inside a Class :

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);
        }
    }
}

언어에서 '''는static는 특정 멤버가 해당 유형의 인스턴스가 아닌 유형 자체에 속해 있음을 나타냅니다.

, 의 입니다.static클래스의 모든 인스턴스에서 공유되는 멤버가 생성됩니다.

만약 이 '' 것을 사용하세요.int count = 0;static void main(),count는 be음음음음음음 be variable variable variable 、 '로 .static

static int count = 0;

이 프로그램에서 카운트를 사용하려는 경우 카운트 방식을 정적으로 선언하십시오.

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

이 메서드를 퍼블릭프라이빗으로 선언할 수 있으며 보호도 받을 수 있습니다.이 방법을 사용하고 있는 경우는, 시큐어인 애플리케이션을 작성할 수 있습니다.

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

이는 모델 클래스의 인스턴스를 생성하지 않기 때문에 비정적 메서드 또는 변수를 사용할 때마다 인스턴스를 생성해야 하기 때문입니다.

아래 이미지를 참고하여 쉽게 수정할 수 있습니다.

인스턴스 생성 없음

격식을 차리지 않고

여기에 이미지 설명 입력

내 모델 클래스 파일

여기에 이미지 설명 입력

인스턴스를 만드는 것만으로 클래스 비정적 메서드 또는 변수 오류가 쉽게 사라집니다.

언급URL : https://stackoverflow.com/questions/2559527/non-static-variable-cannot-be-referenced-from-a-static-context

반응형