这和超级java

abs*_*son 6 java

this并且super是关键字不是他们; 那么我如何使用它们以与方法相同的方式将参数传递给构造函数?总之,两者都能表现出如此独特的行为?

Mar*_*ers 8

你是正确的,这两个thissuper是关键字.在Java语言规范定义明确他们必须的行为.简短的回答是这些关键字的行为特别,因为规范说它们必须.

根据规范this可以使用主表达式(仅在某些地方)或显式构造函数调用.

关键字this只能在实例方法,实例初始化程序或构造函数的主体中使用,或者在类的实例变量的初始化程序中使用.如果它出现在其他任何地方,则会发生编译时错误.

因此,您可以使用this函数的参数来传递对当前对象的引用.但是请注意,您不能super以与它不是主表达式相同的方式使用:

public class Program
{   
    void test(Program p) {}

    void run() { test(super); }

    public static void main(String[] args)
    {
        new Program().run();
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

Program.java:5: '.' expected
    void run() { test(super); }
Run Code Online (Sandbox Code Playgroud)

您可以使用,super.foo因为这在15.11中定义为有效:

FieldAccess:
    Primary . Identifier
    super . Identifier
    ClassName .super . Identifier
Run Code Online (Sandbox Code Playgroud)

该规范还对如何使用super进行了限制:

使用关键字super的特殊表单仅在实例方法,实例初始值设定项或构造函数中有效,或在类的实例变量的初始值设定项中有效.这些与可以使用关键字的情况完全相同(§15.8.3).