Java超级和这个关键字

时间:2014-04-25 16:27:42

标签: java this keyword super

我再次来到这里,我想扩展我今天就这个和超级关键词所提出的问题。
我们来举一些例子。
例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而不创建类的等级,但要使用它我必须创建类的等级,对吗?

4 个答案:

答案 0 :(得分:1)

第二个示例不起作用不是因为您还没有创建实例,而是因为mainstaticthis是对当前对象的常量引用。由于静态方法与任何对象无关,并且与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”关键字仅在实例方法中使用。