扩展JFrame - "super"关键字的工作原理是什么?

3

我创建了一个继承JFrame的类,在我的类构造函数中,要设置标题,我可以使用以下方式:

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

或者只需创建一个JFrame对象,例如:

JFrame f = new JFrame("title);

编译器如何区分所有这些内容以得出相同的结论呢?我知道super用于调用超类中被覆盖的方法,但它是如何具体知道要调用setTitle方法的呢?
我的想法是,super调用JFrame类的构造函数,而这里只有一个带有字符串参数的构造函数,所以它基本上是在执行JFrame f = new JFrame("title");,而不需要显式地创建对象。
这是正确的吗?如果不是,有人能解释一下super到底在做什么,为什么setTitle不需要一个对象引用吗?
谢谢
4个回答

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

  2. super.setTitle() 只是一个方法调用。如果您已覆盖 setTitle(),它将忽略您的定义并调用相同的方法在父类上。通常用于对超类方法进行“链接”。

  3. super( "title" ) 只能作为构造函数的第一行被调用。这不是一个方法调用。它调用超类中的特定构造函数,构造该对象,然后继续执行您的构造函数代码。这是所有构造函数的工作方式。如果您没有指定构造函数,则自动调用无参构造函数(super())。


最详细的答案,对我帮助很大。我不知道super()专门用于构造函数调用,但现在看来,super() = 构造函数调用,而super.methodName()调用超类中被覆盖的方法。非常感谢您的帮助。 - user3186023

1
如果您查看框架对象,调用super(JFrame)意味着您将参数传递到JFrame中,因此JFrame jf = new JFrame(“Title”);super(“Title”);相同(假设超级类型为JFrame)。

谢谢你。你提到了“如果你看一下Frame对象”,我在哪里可以看到它?如果这是一个愚蠢的问题,对不起。另外,“假设JFrame中的超类型”是什么意思? - user3186023
假设超类型是JFrame,这意味着所讨论的类“implements” JFrame。如果您在类似于Eclipse的编辑器中键入JFrame jf = new JFrame(); 并在Mac上按Command +单击JFrame(在Windows上按Control +单击[而不是右键单击]),它将带您到Java中实际声明JFrame的位置。 - user4920910
这是我按住控制键并单击时得到的内容:http://gyazo.com/82d77b6b6fb2a534439ece4b74fad19e - 我相信我之前尝试过,但出现了同样的错误。 - user3186023
发布一个关于此的问题并评论一个链接。 - user4920910
目前对我来说并不是太大的问题,因为JUnit测试似乎仍然可以正常工作。很奇怪... - user3186023
显示剩余3条评论

1
当您在超类中调用super("title")时,您告诉Java“要实例化我的对象,请先调用带有字符串参数的超类构造函数”。如果您没有显式地调用super,则会调用无参构造函数(与Object()构造函数一样)。结果发现JFrame构造函数使用其参数调用setTitle
当您调用setTitle("title")时,这是隐含的,因此您调用了该方法。如果您没有覆盖它,则会调用超类实现。

0
它是如何知道调用setTitle方法的呢?
单独调用super()将会调用超类构造函数。
当你调用setTitle()时,Java会查看该方法是否存在于当前类中。如果不存在,则会查看父类。
如果你重写了setTitle(),在子类中调用setTitle()将调用该类的方法。如果你调用super.setTitle(),它将调用超类中的setTitle()方法。

1
单独调用super()将会调用父类的构造函数。这是我之前不知道的,我以为它也涉及到方法。非常感谢您提供这些信息。 - user3186023

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接