super 學習筆記

2021-07-26 11:44:49 字數 2517 閱讀 5844

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修...