수정 : 정적 컨텍스트에서 정적이 아닌 메소드를 참조 할 수 없음

많은 프로그래머는 코딩 할 때 ' 정적 컨텍스트에서 비 정적 메소드를 참조 할 수 없습니다 '라는 오류 메시지가 표시됩니다. 이 오류 메시지는 구체적이지 않으며 오류 조건이 참인 경우 모든 IDE에서 발생할 수 있습니다.

정적 컨텍스트에서 비 정적 메소드를 참조 할 수 없음

이것은 프로그래머가 클래스의 인스턴스를 만들지 않고 클래스를 '정적으로'사용하려고하는 초보자에게는 매우 일반적인 실수입니다. 정적 클래스를 사용할 때 충족해야하는 몇 가지 조건이 있습니다. 이 기사에서는 여러 가지 사례를 살펴보고 정적 클래스를 사용하는 방법을 안내합니다.

정적 방법이란 무엇입니까?

메소드에 키워드 'static'을 추가하면 메소드를 정적 메소드라고합니다. 정적 메소드는 객체 (표준)에 속하는 것이 아니라 클래스에 속합니다. 클래스의 인스턴스를 생성하지 않고도 정적 메서드를 쉽게 호출 할 수 있습니다.

예를 들어 정적 메소드를 사용하면 정적 데이터 멤버 및 해당 값을 변경할 수 있습니다. 그러나 정적 메소드를 사용할 때 여전히 몇 가지 제한 사항이 있습니다. 예를 들어 클래스의 비 정적 필드에 액세스하려면 비 정적 메서드를 사용해야합니다. 요약하자면 정적 메소드는 매우 여분으로 사용되지만 이점이 있습니다.

다음은 모든 객체의 속성을 변경하기 위해 정적 메서드를 만드는 방법에 대한 간단한 예입니다.

 학생 수강생 {int roll_no; 문자열 이름; static String college = "정보 기술"; static void change () {college = "관리";} 학생 (int 숫자, 문자열 name_self) {roll_no = 숫자; name = name_self;} void display () {System.out.println (rollno + ""+ name + ""+ college);} public static void main (String args []) {Students.change (); 학생 stu_1 = 신입생 (100, "멕시코"); 학생 stu_2 = 신입생 (202, "American"); 학생 stu_3 = 신입생 (309, "영국"); stu_1.display (); stu_2.display (); stu_3.display ();}} 

프로그램의 출력은 다음과 같습니다.

 100 멕시코 경영 202 미국 경영 309 영국 경영 

클래스와 클래스 인스턴스의 차이점은 무엇입니까?

길을 걷고 있다고 생각하면 자동차가 보입니다. 이제 모델 또는 유형이 무엇인지 모르더라도 이것이 자동차임을 즉시 알 수 있습니다. 이것은 이미 알고있는 '자동차'클래스에 속한다는 것을 알고 있기 때문입니다. 여기에서 수업을 템플릿 또는 아이디어로 생각하십시오.

가까이 다가 가면 차의 모형과 차가 보입니다. 여기서 당신은 클래스 '자동차'의 '인스턴스'를 인식하고 있습니다. 여기에 모든 속성이 자세히 표시됩니다. 바퀴, 마력, 림 등

속성의 예로는 'car'클래스에 모든 자동차에 바퀴가 있어야한다고 명시되어있을 수 있습니다. 보고있는 자동차 (자동차 등급의 인스턴스)에는 합금 림이 있습니다.

객체 지향 프로그래밍에서는 클래스를 직접 정의하고 클래스 내부에서 'color'유형의 필드를 정의합니다. 클래스가 인스턴스화 될 때마다 메모리가 백엔드의 색상으로 자동 예약 된 후 나중에이 값에 특정 값 (예 : 빨간색)을 지정할 수 있습니다. 이와 같은 속성은 고유하기 때문에 비 정적입니다.

반대로 정적 메서드와 필드는 모든 인스턴스와 공유됩니다. 이들은 인스턴스 자체가 아닌 클래스에 특정한 가치 또는 항목을 위해 만들어졌습니다. 메소드의 경우 전역 메소드 (예 : stringtoInt 변환기)가있을 수 있으며 필드의 경우 일반적으로 코드에 따라 상수입니다 (예 : 일반 자동차 만 제조하는 경우 자동차 유형은 정적 일 수 있음).

이제 코딩이 잘못 될 수있는 모든 다른 사례를 살펴보고 해결 방법을 확인하겠습니다.

문제 1 : 존재하지 않는 것을 부르고 있습니다.

우리는 사용자가 정적 및 비 정적 메소드를 서로 사용하는 경우를 발견했습니다. 이를 수행 할 때 어떤 메소드가 무엇을 호출하는지 (정적이든 아니든)주의해야합니다. 다음 코드를 살펴보십시오.

 private java.util.List someMethod () {/ * 일부 코드 * / return someList; } public static void main (String [] strArgs) {// 다음 문은 오류를 일으 킵니다. 이유를 알고 있습니다 .. java.util.List someList = someMethod (); } 

여기서 정적 메소드는 someMethod를 호출합니다. 객체 지향 프로그래밍에서는 작업하려는 데이터와 함께 데이터를 캡슐화합니다. 여기에 객체가 없으면 인스턴스 데이터가 없으며 인스턴스 메소드가 클래스 정의의 일부로 존재하지만 항상 데이터를 제공 할 객체 인스턴스가 있어야합니다.

요약하면 존재하지 않는 것을 호출 할 수 없습니다. 객체를 만들지 않았으므로 비 정적 메서드는 아직 존재하지 않습니다. 그러나 반면에 정적 메소드는 항상 정의 때문에 존재합니다.

문제 2 : 방법이 정체되지 않습니다

메소드의 인스턴스를 작성하지 않고 Static 기본 메소드에서 메소드를 호출하는 경우 오류 메시지가 표시됩니다. 여기에도 같은 원칙이 적용됩니다. 존재하지 않는 것에 액세스 할 수 없습니다.

 public class BookStoreApp2 {// 옵션 상수 스캐너 입력 = 새 스캐너 (System.in); public static void main (String [] args) {BookStoreItem [] item; // 배열 배열 항목 = 새로운 BookStoreItem [10]; // 배열 초기화 int itemType = -1; printMenu (); getUserChoice (); for (int i = 0; i <item.length; i ++) {} // 스위치 설명 끝} // for 루프 끝 for (int i = 0; i <item.length; i ++) {} // end for} // 메인 메소드의 끝 

이 코드에서는 printMenu ()getUserChoice () 메소드를 모두 정적 메소드로 변환해야합니다.

따라서 이와 같은 상황을 피하려면 대신 생성자 를 사용할 수 있습니다. 예를 들어 main () 메서드의 내용을 생성자 안에 넣을 수 있습니다.

 public BookStoreApp2 () {// main 메소드의 내용을 여기에 넣습니다} 이렇게 한 후 main () 메소드 안에서 다음을 수행하십시오. public void main (String [] args) {new BookStoreApp2 (); } 

이러한 팁이 작동하지 않거나 코드가 다른 경우 정적 클래스 및 메서드의 기본 원칙을 염두에두고 기본 원칙을 위반하지 않도록 코드를 다시 확인해야합니다.

재미있는 기사