我再次来到这里,我想扩展我今天就这个和超级关键词所提出的问题。
我们来举一些例子。
例1
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 Applet
super.init ();
//code here...
}
}
现在让我们举一个关于这个关键字的例子
public class Main {
public void print () {
System.out.println("Hi");
}
public static void main (String [] args) {
//this code instead does not work because I haven't created an istance of the class
this.print();
}
}
所以问题是:我可以使用super而不创建类的等级,但要使用它我必须创建类的等级,对吗?
答案 0 :(得分:1)
第二个示例不起作用不是因为您还没有创建实例,而是因为main
是static
。 this
是对当前对象的常量引用。由于静态方法与任何对象无关,并且与class
本身相关,因此您无法在静态方法中使用this
。
答案 1 :(得分:0)
您真正的问题是您在静态方法中调用非静态和非声明的方法。因为该方法是静态的,所以该类的所有实例都有一个所有变量的副本。因此,我们不知道哪个实例是“这个”。
您可以通过在main()中初始化类的新实例来解决问题,并引用该实例而不是“this”。
答案 2 :(得分:0)
“super”指的是您要继承的类的实例。 “this”指的是当前对象的一个实例。 “静态”关键字意味着可以在不创建该类的实例(对象)的情况下访问该方法或该属性。
public class Main {
public void print () {
System.out.println("Hi");
}
public static void main (String [] args) {
//this code instead does not work because I haven't created an istance of the class
this.print();
}
}
在此示例中,您尝试从静态方法访问非静态函数。 执行“main”而不创建它的实例,因此为了使用它中的任何方法或属性,您必须将它们声明为静态。 这可行:
public class Main {
public static void print () {
System.out.println("Hi");
}
public static void main (String [] args) {
print();
}
}
编辑:忘记删除“这个”。您无法使用“this”访问静态方法,因为它需要该类的实例。
答案 3 :(得分:0)
您不会在客户端代码中使用“this”关键字(在这种情况下,您的主要方法是客户端)。它仅在非静态类方法中用于引用调用该方法的对象实例。可以将其视为该方法的一个额外的,未指定的参数,其中使用形式参数名称“this”传递对调用对象的引用。
“super”关键字不是指实例,而是指类的直接父级。在这种情况下,超类是Applet,因为您的类Main扩展了该类。因此,当您调用super.init()时,您正在调用“this”上的超类的init()方法,以确保在调用覆盖init()方法时,该方法中完成的任何工作也会完成。您似乎在此处的代码中正确使用它。您可以将super视为对您的实例强制转换为超类的引用。
要回答您的问题,是的,您需要在客户端代码中调用该方法的实例(主方法)。但是,您不会在客户端代码中使用“this”关键字,您将使用对实际实例的命名引用。 “this”关键字仅在实例方法中使用。