2016-07-24 7 views
0

私はスーパークラス(Person)の 'init'メソッドがサブクラス(Student)の 'init'メソッドを実行する前に実行できることを知っています。しかし、なぜそれらの2つか3つの 'init'(私はNSObjectの 'init'同様に実行される)は、同じ生徒のスチューデントによって実行できますか?なぜ 'init'メソッドが同じオブジェクトによって2回実行されるのですか?

@interface Person : NSObject 
@end 

@implementation Person 
- (id)init{ 
if (self = [super init]) { 
NSLog(@"init--------%@",[self class]); 
    } 
return self; 
} 
@end 

@interface Student : Person 
@end 

@implementation Student 
- (id)init{ 
if (self = [super init]) { 
NSLog(@"init--------%@",[self class]); 
    } 
return self; 
} 
@end 


int main(int argc, const char * argv[]) { 

Student *s = [Student alloc]; 
Student *ss = [s init]; 

return 0; 

} 

私のコードの結果:あなたのメソッドを呼び出すと--------学生

のinit

--------学生

答えて

2

のinit

あなたのクラスタイプは変更されていません。 initStudentオブジェクトの場合はinitPersonと呼びますが、まだStudentです。

+0

私はあなたのコメントを参照して、私はなぜ私は学生のinitを呼び出す学生オブジェクトを初期化するのか分からない、まだ学生です。しかし、私はオーバーライドについて考えています。サブクラス(Student)の 'init'はスーパークラス(Person)の 'init'を上書きしました。私がStudentオブジェクトを初期化すると、Personのinit(オーバーライド)が呼び出され、それ自身がinitを呼び出します。それが正しいか間違っているか確かめてください。 – CJiYI

+0

@CJiYI問題は何か分かりませんが、これは間違いなく意図された動作です。クラスを適切に構築するには、通常、スーパークラスのコンストラクタを呼び出す必要があります。 obj-cにはコンストラクタの概念がないので、代わりに 'init'メソッドファミリを使用するのがコンベンションですが、その考え方は変わりません。 –

+0

メソッドは、クラスのインスタンスへのポインタを取得する関数です。通常、インスタンスは同じ型のクラスですが、サブクラス化の場合は、スーパークラスのメソッドをサブクラスのインスタンスとともに呼び出すことができます。しかし、それはまだポインタを取得する関数呼び出しです。ポインタが何を指しているかは変わりません。どんなオブジェクトでも、あなたはメソッドを呼び出しただけで、変更することはできません。 – Avi

関連する問題