这和超级java
this
和super
关键词不是他们; 那么我如何使用它们以与方法相同的方式将参数传递给构造函数? 总之,两者都能表现出如此独特的行为?
你是正确的, this
和super
都是关键词。 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
调用。
根据维基百科 , this
和super
是关键词,这是他们如何逃脱他们所有的魔法,我想。