这是java中的“超级”和“超级”
这是java中的“超级”和“超级”,java,Java,this和super是关键词,不是吗;那么,我如何使用它们向构造函数传递参数,就像使用方法一样?? 简而言之,这两种语言是如何表现出如此不同的行为的呢?我不完全确定你在问什么,但这就是语言的设计方式。编译器知道,在构造函数中执行此操作时: super("I'm a string!", 32); 它应该在超类中找到一个构造函数,该构造函数以字符串和int作为参数。您正确地认为this和super都是关键字。明确定义了它们的行为方式。简而言之,这些关键字的行为是特别的,因为规范中说它们必须 根据规
this
和super
是关键词,不是吗;那么,我如何使用它们向构造函数传递参数,就像使用方法一样??
简而言之,这两种语言是如何表现出如此不同的行为的呢?我不完全确定你在问什么,但这就是语言的设计方式。编译器知道,在构造函数中执行此操作时:
super("I'm a string!", 32);
它应该在超类中找到一个构造函数,该构造函数以字符串和int作为参数。您正确地认为
this
和super
都是关键字。明确定义了它们的行为方式。简而言之,这些关键字的行为是特别的,因为规范中说它们必须
根据规范,此
可用于(仅在某些地方)或
关键字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
,因为在中定义了这一点:
FieldAccess:
Primary . Identifier
super . Identifier
ClassName .super . Identifier
该规范还提出:
使用关键字super的特殊形式仅在实例方法、实例初始值设定项或构造函数中有效,或在类的实例变量的初始值设定项中有效;这些情况与使用关键字this的情况完全相同(§15.8.3)
据我所知,
this
和super
都是关键字,我想这就是它们如何摆脱它们所有的魔力。Java语言为这两个关键字提供了特定的处理,并且在有限的上下文中允许它们
调用此(…)将生成字节码,该字节码将调用当前类上的相应构造函数,而调用super(…)将生成字节码,该字节码将调用超类型上的相应构造函数
Java为这些方法提供了特殊的处理,因为它们的绑定与普通方法的绑定不同(即,您希望避免动态调用,否则您将永远无法在超类型上获得构造函数)
每种语言都必须处理这个问题。例如,在C++中,显式指定父方法的名称,而不是使用Super。p> 可以从子类将提供的变量传递给父类。示例比冗长的解释更好,因此这里有一个扩展Exception类以供自己使用的非常通用的示例:
public class MyException extends Exception {
public MyException()
{
}
public MyException(String message)
{
super(message);
}
public MyException(String string, Throwable e)
{
super(string, e);
}
}
这些怎么能表现出这样的能力呢
不同的行为
这个问题没有意义。所有关键字都有不同的行为。这就是他们的目的。我不确定这里的疑问是什么。This
This
引用当前实例,也可以像调用This(arg)
一样调用当前类中相应的构造函数。类似地,当调用super()
时,它调用super
类中相应的构造函数。只能从构造函数调用它们
是否在super和this下对此类行为进行编码?@abson它是编码的,但不是由您编写的。我想这是JVM的一部分,也可能是编译器。您应该将此和super视为+和-,编译器只知道如何处理它们。+1用于提及将此作为参数传递,而根据它们是关键字,相同的不适用于super。维基百科不是一个规范性参考。