super是乙個編譯指示器,僅僅是給編譯器看的,不是乙個指標。只要編譯器看到super這個標誌,就會讓當前物件呼叫父類的方法,但是方法的呼叫者還是當前物件本身。
// ----- model.h -----
#import
@inte***ce
model : nsobject
//僅僅開放乙個方法,不實現
- (void)test;
@end
// ----- model.m -----
#import "model.h"
@implementation
model
@end
// ----- submodel.h -----
#import "model.h"
// 繼承自model
@inte***ce
submodel : model
@end
// ----- submodel.m -----
#import "submodel.h"
@implementation
submodel
// submodel繼承自model,呼叫父類定義的方法test
- (void)test
@end
// ------ viewcontroller.m ------
- (void)viewdidload
呼叫結果假如在submodel中呼叫父類的test方法,將4個log放入父類的test方法中,輸出結果還是和上例一樣。因為self還是submodel物件,它僅僅只是呼叫了父類的方法。// ------ submodel.m ------
// submodel繼承自model,呼叫父類定義的方法test
- (void)test
// ------ model.m ------
- (void)test
呼叫結果super底層**#import
@inte***ce
model : nsobject
@end
@implementation
model
- (instancetype)init
@end
int main(int argc, const
char * argv)
return
0;}
// main.cpp
#ifndef _rewriter_typedef_model
#define _rewriter_typedef_model
typedef
struct objc_object model;
typedef
struct {} _objc_exc_model;
#endif
struct model_impl ;
/* @end */
// @implementation model
static instancetype _i_model_init(model * self, sel _cmd) , sel_registername("init"));
return
self;
}// @end
int main(int argc, const
char * argv)
return
0;}
((model *(*)(__rw_objc_super *, sel))(void *)objc_msgsendsuper)((__rw_objc_super), sel_registername("init"))
// 將強制型別轉換全部刪除掉
objc_msgsendsuper(,sel_registername("init"))
objc_msgsendsuper(, ) 第乙個引數是個objc_super結構體,第二個引數是sel// receiver是指類的例項,super_class則是指該例項的父類
struct objc_super ;
java學習筆記 super的使用
又如,當覆蓋父類的同名方法的同時,又要呼叫父類的方法就必須使用super void sayhello 在覆蓋父類方法的同時,又利用已定義好的父類方法 構造方法是不能被繼承的,例如父類裡有乙個構造方法person string,int 不能說子類student也自動有了此構造方法 在子類中,我們可以用...
學習筆記 Super關鍵字
package com.shine public class entry class parent public parent string s public void thought super的第一種用法 在構造器中使用super 在構造器中使用super 經常用於呼叫父類構造器 當父類不存在無...
Java學習筆記之Super關鍵字學習。
super 可用來修飾屬性 方法 構造器。1 當之類與父類中有同名屬性時,可以通過 super.此屬性 顯示的呼叫父類中宣告的屬性。若想呼叫子類的同名屬性可以使用 this.同名屬性。2 當子類重寫父類的方法後,在子類中若想再顯示的呼叫父類的被重寫的方法,就需要用 super.方法 3 super修...