[英]Extending JFrame - how does “super” keyword work?
我制作了一个扩展JFrame
的类,并在我的类构造函数中设置了我可以使用的标题:
super("title");
setTitle("title");
或只是创建一个JFrame
对象,即:
JFrame f = new JFrame("title);
编译器如何与所有这些区别以得出相同的结论? 我知道super用于调用超类中的重写方法,但是如何特别知道调用setTitle
方法呢?
我的想法是super调用JFrame
类的构造函数,并且只有一个构造函数带有字符串参数,因此它基本上是在做: JFrame f = new JFrame("title);
而没有显式创建对象。
这是真的? 如果不是,有人可以解释super到底在做什么,为什么setTitle
不需要对象引用?
干杯
new JFrame( "title" )
调用JFrame
的构造函数。 它可能调用setTitle()
(但可能不会调用),或者可能只是设置用于保存标题的内部变量。
super.setTitle()
只是一个方法调用。 如果您重写了setTitle()
,它将忽略您的定义并在超类上调用相同的方法。 通常用于“链接”到超类的方法。
super( "title" )
只能被称为构造函数的第一行。 这不是方法调用。 它调用超类中的特定构造函数,构造该对象,然后继续构造函数代码。 这就是所有构造函数的工作方式。 如果不指定构造函数,则将自动调用无参数构造函数( super()
)。
如果查看框架对象,则调用super(JFrame)意味着您要将参数传递到JFrame中,因此JFrame jf = new JFrame("Title");
与super("Title");
(假设超级类型是JFrame)
当您在父类中调用super("title")
时,您告诉Java“实例化我的对象,首先在具有String参数的父类上调用构造函数”。 如果没有显式的超级调用,则将调用no-arg构造函数(与Object()
构造函数一样)。 事实证明,JFrame构造函数使用其参数调用setTitle
。
调用setTitle("title")
,这是隐含的,因此您可以在对象上调用方法。 如果尚未覆盖它,则将调用超类实现。
具体如何知道调用setTitle方法?
单独调用super()
将调用超类构造函数。
当您调用setTitle()
Java会查看该方法是否存在于当前类中。 如果没有,它将查看父类。
如果您重写了setTitle()
,则从子类中调用setTitle()
将调用该类的方法。 如果调用super.setTitle()
,它将在超类中调用setTitle()
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.