这和超级java

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

你是正确的, 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(); } } 

结果:

 Program.java:5: '.' expected void run() { test(super); } 

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

 FieldAccess: Primary . Identifier super . Identifier ClassName .super . Identifier 

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

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

Java语言为这两个关键字提供了特定的处理,并且在有限的上下文中允许使用它们。

调用this(…)将导致字节码将调用当前类的相应构造函数,而调用super(…)将导致字节码将调用超类型上的相应构造函数。

Java为这些提供了特殊处理,因为它们的绑定与普通方法的绑定不同(即,您希望避免动态调用,或者您永远不会设法获取超类型的构造函数)。

每种语言都必须处理这个问题。 例如,在C ++中,您显式指定父方法的名称而不是使用super。

我不完全确定你在这里问的是什么,但这是语言设计的方式。 编译器知道在构造函数中执行此操作时:

 super("I'm a string!", 32); 

它应该在超类中找到一个构造函数,它接受一个String和一个int作为参数。

从您的子类中,您可以将提供的变量传递给您的父类。 示例比长解释更好,所以这里是为您自己的用法扩展exception类的一个非常通用的示例:

 public class MyException extends Exception { public MyException() { } public MyException(String message) { super(message); } public MyException(String string, Throwable e) { super(string, e); } } 

这些可以表现出如此不同的行为

这个问题没有意义。 所有关键字都有不同的行为 这就是他们的目的。

我不确定这里有什么疑问。 这指的是对当前实例的引用,也就像this(arg)调用它this(arg)它调用当前class的相应constructor 。 类似地,当调用super() ,它调用super类中的相应constructor 。 它们只能从constructor调用。

根据维基百科 , thissuper是关键词,这是他们如何逃脱他们所有的魔法,我想。