扩展 JFrame - "super" 关键字如何工作?

Extending JFrame - how does "super" keyword work?

我做了一个扩展 JFrame 的 class,在我的 classes 构造函数中,我可以使用以下方法设置标题:

super("title");
setTitle("title");

或者只是创建一个 JFrame object 即:

JFrame f = new JFrame("title);

编译器如何从所有这些中区分出来得出同样的结论?我知道super是用来调用superclass中重写的方法的,但是它具体是怎么知道调用setTitle方法的呢?

我的想法是super调用JFrameclass的构造函数,而且只有一个构造函数接受一个字符串参数,所以它基本上是这样的: JFrame f = new JFrame("title);,没有显式创建 object。

这是真的吗?如果不是,有人可以解释一下 super 到底在做什么,为什么 setTitle 不需要 object 引用?

干杯

如果您查看 Frame 对象,调用 super (JFrame) 意味着您将参数传递给 JFrame,因此 JFrame jf = new JFrame("Title");super("Title"); 相同(假设 super 类型是 JFrame)

how does it specifically know to call the setTitle method?

单独调用super()会调用超级class构造函数。

当您调用 setTitle() 时,java 会查看当前 class 中是否存在该方法。如果没有,它将查看父 class.

如果您覆盖了 setTitle(),从子 class 中调用 setTitle() 将调用该 class' 方法。如果你调用 super.setTitle() 它将调用 super class.

中的 setTitle() 方法

当你在超级 class 中调用 super("title") 时,你告诉 Java "to instantiate my object, first call the constructor on the super class that takes a String argument"。如果您没有显式的 super 调用,则调用无参数构造函数(与 Object() 构造函数一样)。事实证明,JFrame 构造函数调用 setTitle 及其参数。

当您调用 setTitle("title") 时,这是隐含的,因此您在对象上调用该方法。如果你没有覆盖它,那么超级 class 实现被调用。

  1. new JFrame( "title" ) 调用 JFrame 的构造函数。它可能会调用 setTitle()(但它可能不会),或者它可能只是设置用于保存标题的内部变量。

  2. super.setTitle() 只是一个方法调用。如果您重写了 setTitle(),它会忽略您的定义并在超级 class 上调用相同的方法。它通常用于 "chaining" 到超级 class 的方法。

  3. super( "title" )只能作为构造函数的第一行调用。它不是方法调用。它调用超级 class 中的特定构造函数,构造 object,然后继续您的构造函数代码。这是所有构造函数的工作方式。如果不指定构造函数,将自动调用 no-argument 构造函数 (super())。