我创建了一个扩展JFrame
的类,并在我的类构造函数中设置我可以使用的标题:
super("title");
setTitle("title");
或只是创建一个JFrame
对象,即:
JFrame f = new JFrame("title);
编译器如何区别于所有这些以得出相同的结论?我知道super用于调用超类中的重写方法,但是如何专门知道调用setTitle
方法?
我的想法是super调用JFrame
类的构造函数,并且只有一个构造函数接受一个字符串参数,所以它基本上是这样做的:
JFrame f = new JFrame("title);
,没有明确创建对象。
这是真的吗?如果没有,有人可以解释超级正在做什么,以及为什么setTitle
不需要对象引用?
干杯
答案 0 :(得分:2)
new JFrame( "title" )
调用JFrame
的构造函数。它可能会调用setTitle()
(但它可能不会),或者它可能只是设置用于保存标题的内部变量。
super.setTitle()
只是一个方法调用。如果您覆盖了setTitle()
,它将忽略您的定义并在超类上调用相同的方法。它通常用于"链接"超级的方法。
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()
方法。