2014-04-25 4 views
0

비 정적 메서드는 선언 된 클래스의 인스턴스를 만듭니다? 왜이 코드가 작동하지 않는가?클래스의 인스턴스

import java.awt.*; 

public class Main extends Frame { 
    public Main() { 
     //super keyword needs an istance of the class don't it? 
     super ("My frame"); 
     super.setSize (200,100); 
    } 

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

비 정적 방법은 다음 코드가 작동해야하는 클래스의 인스턴스를 만드는 경우 ...

import.java.applet.*; 

public class Main extends Applet { 
    public void print() { 
     System.out.println ("Hi"); 
    } 

    public void init() { 
     this.print(); 
    } 
} 
+1

일단'홈페이지()'... 당신이 인스턴스에의 호출에 의해 생성되는 하나라고 – abiessu

+3

'홈페이지()', 생성자입니다 _not_ 비에 대한 지금 무엇을 - 정적 방법. –

+0

오 잘 ... 맞아. 두 번째 코드는 어떻게 작동합니까? 그렇다면 왜? – L99

답변

2

만의 맥락에서를 액세스 할 수 있습니다 비 정적 방법을 예 : 이 이미 존재합니다.. 한편

public class Foo { 
    public static void someStaticMethod() { /* ... */ } 

    public void someNonStaticMethod() { /* ... */ } 
} 

: 비 정적 메서드 내에서

Foo.someStaticMethod(); // this works 
Foo.someNonStaticMethod(); // this DOESN'T work 

Foo foo = new Foo(); 
foo.someNonStaticMethod(); // but this does 

, 당신은 기본 (암시)에 의해 인스턴스에 액세스 할 수 있습니다, 또는 명시 적으로 this 키워드를 사용하여 참조 할 수 있습니다. 당신의 예에서 :

public class Main extends Frame { 
    public Main() { 
    //super keyword needs an istance of the class don't it? 
    super ("My frame"); 
    super.setSize (200,100); 
    } 

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

은 ... super에 대한 호출에서 문제의 인스턴스는 new Main()로 만들 암시 적 인스턴스입니다. 자바의 클래스의

1

인스턴스는 new 키워드를 사용하여 생성자를 호출하여 작성됩니다

Main main = new Main(); 

public void Main() { } 그러나없는 생성자 입니다,하지만, 인스턴스 메소드는 (귀하의 예제에서,라는 결코 극복하는).

public class Main { 

    public static void main(String[] args) { 
     Main main = new Main(); // create instance 
     main.Main(); // call method 'Main' 
     new Main().Main(); // or both at once 
    } 

    public Main() { 
     // this is the (default) constructor 
    } 

    public void Main() { 
     // this is an instance method (whose name 'should' start lowercase 
    } 
} 
+0

오 오른쪽 내가 무효 작성에 실패했습니다 – L99

0

는 비 정적 방법은이 선언 된 클래스의 인스턴스를 만들 수 있습니까?

이 코드가 작동하는 이유는 제

?

이러한 메서드가 호출 될 때 이미 인스턴스화 된 인스턴스에서 호출해야하기 때문에. "this"/ "super"는 해당 인스턴스 인 암시 적 매개 변수를 참조합니다 (인스턴스화되고 다른 곳에서 "new"로 전달됨). 인스턴스화가 발생하지 않으면 NullPointerException이 즉시 발생합니다.

0

사실 나는 주된 질문에서 잘못된 코드를 작성했습니다. (나는 하루 종일 있었고 꽤 피곤했습니다) 어쨌든 더 많은 것을 이해하는 데 도움이되었습니다. 이 코드

import java.applet.*; 

public class Main extends Applet { 
     //overrides Applet.init() 
     public void init() { 
      //here I use super keyword without creating an istance of the class 
      super.init(); 
      //code here... 
     } 
} 
+1

글쎄, 당신은 대답으로 귀하의 질문을 넣어해서는 안됩니다 그리고 나는 코멘트에 답변 답변을 작성해서는 안 ... 도대체 뭐야 :이 작품. 단순히'Applet'의 init 메소드의 동작을 무시하고 내부적으로'Applet' 수퍼 클래스의'init'을 내부적으로 호출합니다. 이것은 표준 관행입니다.결국,'Main'의 인스턴스를 가질 때'init'을 호출 할 것입니다 :'Main m = new Main();'m.init()'; – kiruwka

+0

예 답변에 대한 질문에 죄송합니다. 어쨌든 super 키워드는 작동하지 않아도됩니까? – L99

+0

혼란스러워합니다. 'instance' 메쏘드 안에 있다면 (즉, 클래스의 비 정적 메쏘드) - init은 위의 인스턴스 메쏘드입니다. 여러분은 항상'this'에 의해 참조 할 수있는 그 클래스의 인스턴스를 가지고 있습니다. 'parent '를 참조 할 수도 있습니다. 즉, super를 사용하여 상속 된 기능을 참조 할 수 있습니다. – kiruwka

관련 문제