2011-11-14 3 views
14

저는 자바에서의 멍청한 놈입니다.하지만 오늘 밤 연습하면서 OOP 디자인을 사용하면 메인 클래스의 모든 메소드가 정적이어야합니다. 이 코드에서는 정적이 아닌 클래스 내에서 메서드를 호출 할 수있는 방법이 없습니다. 그것은 어쩌면 당신이 클래스를 정적으로 선언 할 것인가에 대한 요점을 놓치고있는 것처럼 보입니다. 당신의 도움을 주셔서 감사합니다!메인 클래스의 모든 메소드는 정적이어야합니까?

public class JavaApplication2 { 

private static CreateCar Vroom; 
private static Limo Fuuu; 

public static void main(String[] args) { 
    Vroom = new CreateCar(); 
    Vroom.creator(); 
    getGas(); 
    addGas(); 
    getGas(); 
    Fuuu = new Limo(); 
    Fuuu.creator(); 
    Fuuu.wheels = 5; 
    Fuuu.wheelie(); 
} 
public static int getGas(){ 
    Vroom.returnGas(); 
    return 0; 
} 
public static void addGas(){ 
    Vroom.fillerUp(); 
} 
} 

답변

33

정적이 아닌 메서드를 호출 할 수는 있지만 개체를 ​​통해서만 수행 할 수 있습니다. 즉, 주어진 객체에 대해 메소드를 호출해야합니다.

메인 클래스도 인스턴스화 할 수 있으므로 메인 클래스의 모든 메소드가 정적 일 필요는 없습니다. 예 :

public class MainClass { 
    int value; 

    public void printValue() { 
     System.out.println("" + value); 
    } 

    public static void main(String[] args){ 
     MainClass o = new MainClass(); 
     o.printValue(); 
    } 
} 
+1

간결하고 매우 도움이되었습니다. – Zombian

+0

감사합니다.이 답변을 기다리고있었습니다. –

+0

이 작업을 수행하는 더 좋은 방법은 무엇입니까? 그 안에 클래스를 인스턴스화하거나 모든 메서드를 정적으로 선언하면됩니까? –

2

어, "정적 메인"클래스가 없습니다. JavaApplication2 클래스에 main이라는 정적 메서드가 있습니다.

해당 클래스에 다른 정적 메서드가 필요하지 않습니다. 클래스를 사용하려면, 당신은 그것을 인스턴스화 것 :

public static void main(String[] args) 
{ 
    JavaApplication2 myApp = new JavaApplication2(); 
    myApp.someMethod(); 
    ... 
} 

main은 진입 점 역할을 구체적으로 명명 된 정적 방법이다. 당신이 좋아하는 명령 줄에서 프로그램을 "실행"자바를 말할 때 :

자바 JavaApplication2

JVM은 명령 줄 인수를 전달 JavaApplication2.main() 호출합니다.

+0

Ahh! 당신이 옳았다는 것에 대해 고맙다. – Zombian

3

짧은 대답 : 예.

그 이유는 JVM이 이미 해당 클래스의 기존 인스턴스가 모두 존재하지 않는 클래스 "주"을 호출해야하기 때문입니다..

마이너 의미 론적 피킹 : "main"은 클래스의 멤버 (정적 멤버)입니다. 그것은 클래스 그 자체의 이름이 아닙니다.

유용한 팁 : 각 클래스는 자신의의 수, DIFFERENT "주()". 이것은 개별 클래스를 단위 테스트하는 데 매우 유용 할 수 있습니다.

"main()"이 ".exe"와 연결된 C/C++ 프로그래머에게는 때로는 충격이되며, 개 중 하나만 개 있습니다. 자바에서는 많은 "main()"메소드를 가질 수 있으며 런타임에 선택하는 메소드를 호출 할 수 있습니다.

+0

+1은 때때로 "main()"이 ".exe"와 연결되어있는 C/C++ 프로그래머에게 충격이되며, 그 중 하나만 가질 수 있습니다 ... – CoolEulerProject

7

No. 그러나, main 방법은 static이어야한다.

클래스에서 비 정적 메소드를 호출하려면 해당 클래스객체참조를 만들어야합니다. 그런 다음 참조에서 메서드를 호출합니다.

public class JavaApplication2 { 
    // non-static method 
    public void go() { 
     System.out.println("hello"); 
    } 

    public static void main(String[] args) { 
     // declare a reference 
     JavaApplication2 app; 
     // create an object 
     app = new JavaApplication2(); 
     // call a method 
     app.go(); 
    } 
} 
+0

와우이 설명은 많은 도움이됩니다. . 고맙습니다! – Zombian

0

짧은 대답 : 아니오, 모든 방법을 정적 일 필요는 없습니다.사실

:

  1. 작은 운동에 대한, 그것은 당신의 주요 방법에 대해 다른 클래스가없는 것이 가장 좋습니다.
  2. 주 방법으로 여러 클래스를 가질 수 있습니다 (많은 라이브러리에서 테스트 또는 클래스 사용을 위해 매우 일반적 임)
  3. 일반적으로 jar 파일 인 Java 프로그램을 호출 할 때 다음 중 하나를 선택할 수 있습니다. 어느 클래스의 주된 메소드를 호출하고 싶은가?
  4. 초보자가 필요로하지 않는 한, 정적 메소드를 피하려고합니다. 이것은 객체 지향 프로그래밍이 좋지 않은 누군가가 정적 메소드를 사용하여 함수 지향 프로그래밍 (기능 프로그래밍과 혼동하지 말 것)을 쉽게 남용 할 수 있기 때문입니다.
  5. 주요 방법 정적이어야합니다 (참고, 난 "는"주요 방법은 말하고 있지 않다) : 클래스 이름으로 참조 할 수 있도록 public static void main (String [] argv) { /* ... */ }
0

방법은 예를 들어

... 정적으로 선언 사용자 불리는이 방법
Math.pow(x,y) // x^y 

는 .... 정적이 너무 정적 인 방법을 사용하는 이유는 기본적인 이유를 먹으 렴으로 수학이 모든 방법을 가지고 로 ... 인스턴스 생성에 대해 걱정할 필요가 없습니다

정적 메서드는 비 정적 메서드를 호출 할 수 있지만 클래스의 객체

ClassName cn =new ClassNam().methodName; 

) (주 특별한 방법, 프로그램의 실행의 출발점, 그래서 u는 프로그램을 실행하지 않고 객체를 가질 수 없어이며, 따라서 그 (실행 :: 자바 클래스 이름)처럼라고, 그래서

0

정적 메소드는, 경우에 따라서는 ClassName

public class ClassName{ 
    //no-op 
    public static void method(){//....} 
}  
ClassName.method(); 

을 통해 직접 호출 할 수 있다는 말은 ... 정적이어야합니다 예를 들어 생략 할 수 있습니다.

static import 

main method 

그러나 정적이 아닌 메서드를 호출하려면 먼저 해당 메서드를 시작해야합니다.

관련 문제