Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是java中的“超级”和“超级”_Java - Fatal编程技术网

这是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。维基百科不是一个规范性参考。