2010-06-15 4 views
3
public class Function 
{ 
    public static void main(String args[]) 
    { 
     System.out.println(power(3,2)); 
     System.out.println(power(3,2)); 
     System.out.println(power(2)); 
    } 
    public long power(int m) 
    { 
     return m*m; 
    } 
    public long power(int m,int n) 
    { 
     long product=1; 
     for(int i=1;i<=n;i++) 
     { 
      product=product*m; 
     } 
     return product; 
    } 
} 

컴파일러이 오류를 표시 들쑥날쑥 한 것들에 대해서 :/나는 그 사실을 지금부터 염두에 둘 것이다.Java 초급 질문 : 아래 코드에 어떤 문제가 있습니까?</p> <p>Function.java:5 : 비 정적 메소드 전력 (INT, INT)</p> <p>[편집]</p> <p>미안 정적 콘텍스트에서 참조 될 수 없다 : -

좋아, 이제 정적 키워드를 추가 했으므로 이제는 정상적으로 작동합니다. 이 정적 키워드는 어떤 차이점이 있습니까? 저는 초보자이며 정적이 무엇인지 아직 연구하지 않았습니다. 나는이 책의 다른 장에서 분명히 읽을 것이지만 누군가 나에게 그것이 무엇인지에 대한 아이디어를 주길 바란다. 감사.

+3

잘못된 것이 있습니다. 적절한 들여 쓰기가 없습니다! –

+1

또 다른 포인트 ... 이것은 오류가 아니지만'String args []'보다 (실제로는 동일하지만)'String [] args '를 코딩하는 데 더 많이 받아 들여집니다 ... – froadie

+0

@froadie : 문자열 ... args'? –

답변

4

(전체 배경 설명없이) 엄지 손가락의 바로 가기 규칙은 정적 방법/기능은 무엇 때문에 비 정적 메소드/함수를 호출 할 수 없다는 것입니다 : 같은

참고로,이 보일 것이다 당신은 당신의 주요 기능에서 호출하기를 원할 것입니다 그것 앞에 정적 키워드가 있어야합니다.

핵심 문제는 Java가 객체 지향 언어이고 정적 대 정적이 아닌 것은 객체 지향에 대한 사전 지식이 필요하다는 것입니다. Java의 단점 중 하나는 초보자가 학습 할 때이 유형의 몇 가지 농구를 뛰어 넘을 필요가 있다는 것입니다.이 모든 것은 객체 지향적 인 Java의 특성에 기인하며 일단 OO를 이해하면 모든 것이 제자리에 들어갑니다. 언어 디자이너가 내리는 결정은 반드시 가장 좋은 것은 아니지만 논리적 인 것입니다.)

나는 정적 인 것에 대한 설명에 들어 가지 않으면 그것을 찾지 못할 것입니다. 나는 그것이 특별히 어려운 개념은 아니지만 단지 OO 개념의 몇 가지 구성 요소에 의존하고 있다고 설명 할 수 있습니다. (어쨌든 나에 의해) 설명을 조기에 시도하는 것은 당신을 해할 수도 있습니다.

9

오류 메시지에 따르면 정적 메서드 (main)는 개체 인스턴스없이 비 정적 메서드 (power)를 호출 할 수 없습니다.

power 메서드를 정적으로 만들어야합니다.

설명

일반 클래스 메소드는 클래스 인스턴스와 연관됩니다.
예를 들어 String.startsWith methodString 인스턴스에서만 호출 할 수 있습니다. 문자열 인스턴스없이 startsWith을 호출하는 것은 의미가 없습니다.

경우에 따라 클래스 인스턴스가 필요없는 메소드를 생성하려고 할 수 있습니다.
예를 들어 Integer 인스턴스에서는 Integer.parseInt method이 호출되지 않습니다. Integer.parseInt을 호출하기 위해서 Integer 인스턴스를 생성해야한다는 것은 의미가 없습니다.
이러한 방법을 static 메서드라고합니다.

mainstatic 방법의 예입니다. Function 클래스의 인스턴스에서 호출되지 않으므로 인스턴스 메서드를 호출 할 수 없습니다.

3
public static void main(String args[]) 
{ 
    // Create an object 
    Function f = new Function(); 

    System.out.println(f.power(3,2)); 
    System.out.println(f.power(3,2)); 
    System.out.println(f.power(2)); 
} 
+2

나는 OP가 정적 대 non-static 호출에 대한 설명에 더 잘 도움이 될 것이라고 믿는다. 왜 그것들은 양립 할 수 없다. –

+0

오, 클래스라는 함수가 있나요? 그게 새롭고 흥미로운 .. 렘보세요! – Serenity

+0

예 있습니다. 그것은 영업 중입니다. – dty

2

당신은 static 방법 (주)에서 인스턴스 메서드를 호출 (그들을 호출 할 인스턴스가 없기 때문에). power 메서드를 정적으로 만들거나 main 내부에 Function 클래스의 인스턴스를 만들고 Function.power()을 호출해야합니다.

2

정확하게 말합니다.

정적 메서드에는 클래스 인스턴스가 필요하지 않습니다. MyClass.staticMethod() 만하면됩니다. 비 정적 메서드 (또는 인스턴스 메서드)는 클래스의 인스턴스에서 작동합니다. 따라서 :

MyClass myClass = new MyClass(); 
myClass.instanceMethod(); 

실제로 존재하지 않기 때문에 비 정적 메서드를 호출 할 수 없습니다. 비 정적 메소드는 그것이 속한 클래스의 인스턴스 컨텍스트에서 호출 될 때만 존재합니다.

해결 방법은 power을 정적 방법으로 지정하는 것입니다.

2

이것은 초보자에게 흔한 혼란의 원인입니다. 메서드가 공개되어 있고 main 메서드와 같은 클래스이기 때문에 언제든지 원하는 메서드를 호출 할 수있는 것은 아닙니다. main()은 정적 메서드이기 때문에 메서드를 호출 할 개체가 없습니다.

당신은 두 가지 방법으로 수정할 수 있습니다 :

  1. power 방법 static을 확인합니다. 이것은 아주 작은 프로그램을위한 가장 간단한 방법입니다.

    무엇을 static은 메서드를 호출하기 위해 개체를 만들 필요가 없다는 것을 의미합니다. 다른 클래스에서 정적 메서드를 호출하는 경우 Math.function(x)처럼 보이지만 이러한 정적 메서드는 동일한 클래스에 있으므로 단지 function(x)처럼 보입니다.

  2. Function 클래스의 개체를 만들고 그에 대한 power 메서드를 호출하십시오. 이것은 당신이 더 큰 프로그램을 위해 평상시에하는 일이지만, 실제로는 이해가되지 않습니다.

    Function f = new Function(); 
    
    System.out.println(f.power(3,2)); 
    System.out.println(f.power(3,2)); 
    System.out.println(f.power(2)); 
    
1

이렇게 명확한 또 다른 방법은 메서드를 정적으로 표시하는 것입니다. (main과 같이 정적 메서드에서 정적 메서드가 아닌 메서드를 호출 할 수는 없지만 비 정적 방법) :

public class Function 
{ 
    public static void main(String args[]) 
    { 
     System.out.println(power(3,2)); 
     System.out.println(power(3,2)); 
     System.out.println(power(2)); 
    } 
    public static long power(int m) 
    { 
     return m*m; 
    } 
    public static long power(int m,int n) 
    { 
     long product=1; 
     for(int i=1;i<=n;i++) 
     { 
      product=product*m; 
     } 
     return product; 
    } 
}