扩展JFrame - “超级”关键字如何工作?

时间:2015-06-16 15:49:09

标签: java object jframe super

我创建了一个扩展JFrame的类,并在我的类构造函数中设置我可以使用的标题:

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

或只是创建一个JFrame对象,即:

JFrame f = new JFrame("title);

编译器如何区别于所有这些以得出相同的结论?我知道super用于调用超类中的重写方法,但是如何专门知道调用setTitle方法?

我的想法是super调用JFrame类的构造函数,并且只有一个构造函数接受一个字符串参数,所以它基本上是这样做的: JFrame f = new JFrame("title);,没有明确创建对象。

这是真的吗?如果没有,有人可以解释超级正在做什么,以及为什么setTitle不需要对象引用?

干杯

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

当你在超级类中调用super("title")时,你告诉Java“实例化我的对象,首先调用带有String参数的超类上的构造函数”。如果没有显式的超级调用,则调用no-arg构造函数(与Object()构造函数一样)。事实证明,JFrame构造函数使用其参数调用setTitle

当您致电setTitle("title")时,这是隐含的,因此您可以在对象上调用该方法。如果你没有覆盖它,那么就会调用超类实现。

答案 3 :(得分:0)

  

如何专门知道调用setTitle方法?

单独调用super()将调用超类构造函数。

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

如果您已覆盖setTitle(),则在子类中调用setTitle()将调用该类的方法。如果您致电super.setTitle(),它将调用超类中的setTitle()方法。