[英]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.