课程实例

时间:2014-04-25 20:26:16

标签: java

非静态方法是否创建了声明它的类的实例?如果不是为什么这段代码有效?

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();
    }
}

4 个答案:

答案 0 :(得分: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 :(得分:1)

Java中的类实例是通过使用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
    }
}

答案 2 :(得分:0)

  

非静态方法是否创建了声明它的类的实例?

没有

  

为什么这段代码有效?

因为调用这样的方法时,应该从已经实例化的实例中调用它。 “this”/“super”是指隐含参数,它是有问题的实例(实例化并从其他地方传入,带有“new”)。如果没有发生实例化,将立即抛出NullPointerException。

答案 3 :(得分: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... 
         } 
}