在Java中,对super()参数列表中的静态方法的调用是有效的。为什么?

狮子:

让我们看一下下面的Java代码段。

package trickyjava;

class A
{
    public A(String s)
    {
        System.out.println(s);
    }
}

final class B extends A
{
    public B()
    {
        super(method());      // Calling the following method first.      
    }

    private static String method()
    {
        return "method invoked";
    }
}

final public class Main
{
    public static void main(String[] args)
    {
        B b = new B();
    }
}

按照约定,Java中super()构造函数必须是相关构造函数主体中的第一条语句。在上面的代码中,我们在super()构造函数参数列表本身中调用static方法super(method());。


这意味着在构造函数B()中对super的调用中,在进行对super的调用之前,将调用一个方法!编译器应禁止这样做,但效果很好。这在某种程度上等同于以下语句。

String s = method();
super(s);

但是,这是非法的,导致出现编译时错误,表明“对super的调用必须是构造函数中的第一条语句”。为什么?以及为什么它等同于super(method()); 是有效的,编译器不再抱怨了吗?

Barend:

这里的关键是static修饰符。静态方法绑定到,实例方法(普通方法)绑定到对象(类实例)。构造函数从一个类初始化一个对象,因此该类必须已经完全加载。因此,调用静态方法作为构造函数的一部分是没有问题的。

加载类和创建对象的事件顺序如下:

  1. 负荷等级
  2. 初始化静态变量
  3. 创建对象
  4. 用构造函数初始化对象<-
  5. 现在可以使用对象了

(简体*)

到对象构造函数被调用时,静态方法和变量可用。

将类及其static成员视为该类对象的蓝图。您只能在蓝图已经存在的情况下创建对象。

构造函数也称为初始化程序。如果从构造函数中抛出异常并打印堆栈跟踪,您会注意到它<init>在堆栈框架中被调用。实例方法只能在构造对象之后调用。不能将实例方法用作super(...)构造函数中调用的参数

如果创建相同类的多个对象,则步骤1和2仅发生一次。

(为清晰起见,省略了静态初始化程序和实例初始化程序)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有效地将参数列表拼接到函数调用中

使用Java中的静态方法将有效值返回给调用方

为什么模板参数中的双冒号有效?

参数列表中的void_t有效,但不作为返回类型

模板参数列表中的额外typename关键字:有效吗?

您可以在Python中检索函数的有效参数列表吗?

Java中,为什么collections.sort()仍然有效,与非比较类型的参数?

在 Java 方法中传递对象参数的有效方法

为什么'\ 117'在Java中是有效的字符文字?

在Java中对元组列表进行排序的有效方法

如何使方法中的参数有效?

这是检查可变参数宏参数列表是否为空的有效方法吗?

C++23中省略参数列表的lambda表达式的有效性

解析带引号的带有空格的参数列表的最有效方法

为什么枚举列表以删除列表中的项目有效?

为什么此参数列表在Python中不会更改?

在随机生成的整数列表中查找所有模式及其出现频率的最有效方法

检查整数列表中的所有元素是否为 0 的最有效的时间/空间方法

为什么使用()调用Node.js REPL中的函数有效?

为什么在Assert.assertNotNull中调用void函数有效吗?

为什么我的API调用在chrome中有效,但在我的代码中无效?

在WPF中做静态ComboBox的有效方法

为什么在Perl中为数组变量分配列表引用有效?

在迭代调用的函数中存储和加载参数的有效方法

什么是使元组列表中的元素在python中唯一的有效方法?

从列表中的字典中删除空值的有效方法是什么?

python方法的参数列表中的“=- 1”是什么?

为什么python中的方法不起作用,但代码比方法有效?

比{{}}更有效的在模板中调用Angular方法的方法?