非静态方法是否创建了声明它的类的实例?如果不是为什么这段代码有效?
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();
}
}
答案 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...
}
}