source

비정적 메서드에 대한 정적 참조를 만들 수 없습니다.

manysource 2022. 11. 23. 20:20

비정적 메서드에 대한 정적 참조를 만들 수 없습니다.

자바어에서 할 때 가 발생함R.string"XML":

public static final String TTT =  (String) getText(R.string.TTT);

오류 메시지는 다음과 같습니다.

오류: Context 형식에서 non-static 메서드 getText(int)를 정적 참조할 수 없습니다.

원인은 무엇이며, 어떻게 해결할 수 있습니까?

★★getText()아아아아아아아아아아아아아아아아아아아아아아아아.이치노

그 이유를 이해하려면 두 가지 차이점을 이해해야 합니다.

인스턴스(비정적) 메서드는 특정 유형(클래스)의 개체에서 작동합니다.이것들은 다음과 같이 새로운 것으로 작성됩니다.

SomeClass myObject = new SomeClass();

메서드를 합니다.myObject

myObject.getText(...)

단, 스태틱 메서드/필드를 직접 호출할 수 있는 것은 다음과 같습니다. 앞의 문장은 올바르지 않습니다.또한 다음과 같은 객체 참조를 사용하여 정적 필드를 참조할 수 있습니다. myObject.staticMethod()단, 클래스 변수임을 명확히 하지 않기 때문에 권장되지 않습니다.

... = SomeClass.final

또한 서로 다른 데이터 공간(인스턴스 데이터 및 클래스 데이터)에서 작동하기 때문에 함께 작업할 수 없습니다.

제가 설명해 드릴게요.다음 클래스(psuedocode)를 고려합니다.

class Test {
     string somedata = "99";
     string getText() { return somedata; } 
     static string TTT = "0";
}

현재 다음과 같은 사용 사례가 있습니다.

Test item1 = new Test();
 item1.somedata = "200";

 Test item2 = new Test();

 Test.TTT = "1";

어떤 가치들이 있을까요?

음.

in item1 TTT = 1 and somedata = 200
in item2 TTT = 1 and somedata = 99

말하면, 「 」입니다.TTT는 유형의 모든 인스턴스가 공유하는 기준입니다. 때문에 이렇게 것은 .

class Test {
         string somedata = "99";
         string getText() { return somedata; } 
  static string TTT = getText(); // error there is is no somedata at this point 
}

문제는 왜 TTT가 스태틱한가, 왜 getText()가 스태틱하지 않은가 하는 것입니다.

를제 remove remove remove를 remove remove 를 remove 。static이 에러는 극복해야 하지만, 어떤 타입인지 이해하지 못하면 다음 에러까지 붙이는 석고일 뿐입니다.★★★★★★★★★★★★★★★★의 요건은 무엇입니까?getText()정전전 츠요시

설명과 몇 .Context 법 methodgetText() 하면 안 static final String.

질문할 만한 좋은 질문은: 왜 이것을 하고 싶은가?.String의 서 strings및 그 을 「리소스화」에 입력합니다.public static다른 반 학생들이 접근할 수 있도록 하기 위해서겠죠?이치하다 '아예'를 .Context 불러주세요.context.getText(R.string.TTT)내면에서요.

public class NonActivity {

    public static void doStuff(Context context) {
        String TTT = context.getText(R.string.TTT);
        ...
    }
}

당신의 리리 your your your your your your 에서 이것을 Activity:

NonActivity.doStuff(this);

하면 할 수 .String(「」를 하지 ).public staticsyslog.syslog.syslog.

검색에서 이 항목을 발견한 다른 사용자의 경우:

오브젝트명이 아닌 클래스명을 사용하여 함수를 잘못 호출했을 때 자주 발생합니다.이것은 일반적으로 너무 비슷한 이름을 붙이기 때문에 발생합니다.P

즉,

MyClass myclass = new MyClass();

// then later

MyClass.someFunction();

이것은 분명히 정적인 방법입니다.(좋은 점도 있지만) 제가 정말 하고 싶었던 건 (대부분의 경우)

myclass.someFunction();

정말 바보 같은 실수지만, 몇 달마다 30분씩 마이클래스의 정의에서 내가 뭘 잘못하고 있는지 알아내는데 시간을 허비하고 있어요. 오타일 뿐인데 말이죠.

재미있는 주의: 스택 오버플로는 여기서 실수를 분명히 하기 위한 구문을 강조 표시합니다.

변수를 고정적이지 않게 할 수 있습니다.

public final String TTT =  (String) getText(R.string.TTT);

또는 "getText" 메서드를 정적으로 만듭니다(가능한 경우).

getText는 활동의 구성원이므로 "this"가 존재하면 호출해야 합니다.정적 변수는 활동이 생성되기 전에 클래스가 로드될 때 초기화됩니다.

Resource 문자열에서 변수를 초기화하려면 변수를 정적일 수 없습니다.스태틱하게 하려면 String 값을 사용하여 초기화할 수 있습니다.

비스타틱 방식에서는 스태틱 변수를 참조할 수 없습니다.이를 이해하려면 스태틱과 비 스태틱의 차이를 이해해야 합니다.

스태틱 변수는 클래스 변수입니다.이 변수는 처음에 작성된1개의 인스턴스만을 가진 클래스에 속합니다.비정적 변수는 클래스의 개체를 만들 때마다 초기화됩니다.

이제 질문입니다.new() 연산자를 사용하면 모든 오브젝트에 대해 모든 비정적 파일의 복사가 작성되지만 정적 필드의 경우는 그렇지 않습니다.따라서 비정적 메서드에서 정적 변수를 참조할 경우 컴파일 시간 오류가 발생합니다.

이 질문은 새로운 것이 아니며 기존의 답변은 좋은 이론적 배경을 제공합니다.나는 단지 좀 더 실용적인 대답을 덧붙이고 싶을 뿐이다.

getText는 Context 추상 클래스의 메서드로, 이를 호출하려면 하위 클래스의 인스턴스(Activity, Service, Application 또는 기타)가 필요합니다.문제는 콘텍스트의 인스턴스가 작성되기 전에 퍼블릭스태틱 최종 변수가 초기화된다는 것입니다.

이 문제를 해결하려면 몇 가지 방법이 있습니다.

  1. 정적 수식자를 삭제하고 클래스 본문 내에 배치하여 변수를 Activity 또는 컨텍스트의 다른 서브클래스의 멤버 변수(필드)로 만듭니다.
  2. 고정 상태를 유지하고 초기화를 이후 지점으로 지연시킵니다(예를 들어 onCreate 메서드).
  3. 실제 사용 장소의 로컬 변수로 합니다.

네, 비정적 메서드를 정적 메서드로 호출할 수 있습니다.우선 기억해야 합니다.'비정적 메서드로 쉽게 호출할 수 있는 클래스를 정적 메서드로 만들 수 있습니다.

언급URL : https://stackoverflow.com/questions/4969171/cannot-make-a-static-reference-to-the-non-static-method