oc36--自定义构造方法在继承中的表现

//
//  Person.h
#import <Foundation/Foundation.h>

@interface Person : NSObject

@property int age;
@property NSString *name;

/*
 自定义构造方法:
 其实就是自定义一个init方法
 1.一定是对象方法
 2.一定返回id/instancetype
 3.方法名称一定以init开头
*/
- (instancetype)initWithAge:(int)age;

//- (instancetype)initwithAge:(int)age;   // 注意: 自定义构造方法中的init后面的With的W一定要大写

// 一个类可以有0个或者多个自定义构造方法
- (instancetype)initWithName:(NSString *)name;

// 自定义构造方法可以有1个或多个参数
- (instancetype)initWithAge:(int)age andName:(NSString *)name;
@end
//
//  Person.m

#import "Person.h"

@implementation Person

- (instancetype)init
{
    if (self = [super init]) {
        _age = 10;
    }
    return self;
}

- (NSString *)description
{
    return [NSString stringWithFormat:@"age = %i, name = %@", _age, _name];
}

- (instancetype)initWithAge:(int)age
// 注意: 自定义构造方法中的init后面的With的W一定要大写
//- (instancetype)initwithAge:(int)age
{
    if (self = [super init]) {
        _age = age;
    }
    return self;
}

- (instancetype)initWithName:(NSString *)name
{
    if (self  =[super init]) {
        _name = name;
    }
    return self;
}

- (instancetype)initWithAge:(int)age andName:(NSString *)name
{
    if (self = [super init]) {
        _age = age;
        _name = name;
    }
    return self;
}
@end
//
//  Student.h

#import "Person.h"

@interface Student : Person

@property int no; // 学号

- (instancetype)initWithAge:(int)age andName:(NSString *)name andNo:(int)no;
@end
//
//  Student.m
//  day14

#import "Student.h"

@implementation Student

- (instancetype)initWithAge:(int)age andName:(NSString *)name andNo:(int)no
{
    /*
    if (self = [super init]) {
//        _age = age;
        // 狗拿耗子, 多管闲事
        // 自己的事情自己做
        [self setAge:age];
        [self setName:name];
    }
     */
    if (self = [super initWithAge:age andName:name]) {
        _no = no;
    }
    return self;
}

- (NSString *)description
{
    return [NSString stringWithFormat:@"age = %i, name = %@, no = %i", [self age], [self name], _no];  //父类的属性是私有的。
}
@end
//
//  main.m
//  自定义构造方法在继承中的表现

#import <Foundation/Foundation.h>
#import "Student.h"
#import "Person.h"

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

//    Student *stu = [[Student alloc] initWithAge:30 andName:@"lnj"];
    Student *stu = [[Student alloc] initWithAge:30 andName:@"lnj" andNo:888];
    NSLog(@"%@", stu);
    return 0;
}
时间: 2025-01-02 04:18:52

oc36--自定义构造方法在继承中的表现的相关文章

OC中构造方法、自定义构造方法、id类型

一:id类型 1> id 是一种类型,万能指针,能够指向\操作任何的对象. typedef struct objc_object *id; 注意点:在使用id定义的时候,一定要注意(*)id类型默认已经包含了*所以不需要在加*; 局限性:调用一个不存在的方法,编译器会马上报错. 2>instancetype类型 (1)instancetype会让编译器检查实例化对象的准确类型 (2)instancetype只能用于返回类型,不能当做参数使用 3>.instancetype & i

继承中的自定义构造方法

1.继承中的自定义构造方法 不能在子类访问父类私有变量 @interface Person : NSObject @property int age; - (id)initWithAge:(int)age; @end @interface Student : Person @property NSString *name; - (id)initWithAge:(int)age andName:(NSString *)name; @end @implementation Student - (id

Java 继承中的构造方法

Java 继承中的构造方法 子类可以继承父类的构造方法,并遵循以下原则: 子类构造的构成中必须调用其基类的构造方法.    2.子类可以在自己的构造方法中使用super()调用基类的构造方法. 使用this()调用本类的另外的构造方法. 如果调用super(),必须写在子类构造方法的第一行. 3.如果子类的构造方法中没有显示的调用基类构造方法,则系统默认调用基类无参的构造方法.    4.如果子类的构造方法中既没有显示的调用基类的构造方法,而基类中又没有无参的构造方法,则编译会出错. 1 cla

java之继承中的构造方法

继承中的构造方法  1.子类的构造过程中必须调用其基类的构造方法. 2.子类可以在自己的构造方法中使用super(argument_list)调用基类的构造方法. 2.1.使用this(argument_list)调用本类的另外构造方法.  2.2.如果调用super,必须写在子类构造方法的第一行. 3.如果子类的构造方法中没有显示的调用基类的构造方法,则系统默认调用基类的无参数构造方法. 4.如果子类构造方法中既没有显示调用基类构造方法,而基类又没有无参数的构造方法,则编译出错. class

Java 继承中构造方法的执行顺序问题

在Java中,如果一个类没有任何显式创建的构造器则该类默认会有一个无参构造器:如果显式创建了有参构造器则该类就不再有默认无参构造器. 在Java继承中,构造器并不能被继承,而是被显示或隐式调用. 1.子类的构造方法中必须调用其基类的构造方法(显示或隐式) 1.1.若是显示调用,则可以通过 super(argument_list) 来调用,且super调用必须在首行以保证子类对象从所有直接或间接父类中继承的实例变量都被正确地初始化(this关键字可以调用本类中的其他构造器,也必须在首句,因此thi

day4(继承、修饰符、方法的重写、super关键词、继承中的构造方法、object类、对象转型)

1.类的继承(extends)通过继承,子类自动拥有父类的所有成员(成员变量和成员发方法)一个子类只能有一个父类,一个父类可以派生多个子类 2.访问修饰符(private 默认 protected public )对于class的权限修饰只可以用public和defaultdefault只能被同一个包内部的类访问 3.方法的重写(override)在子类中可以根据需要对从父类中继承来的方法进行重写重写方法必须和被重写方法具有相同方法名称.参数列表和返回类型重写方法不能使用比被重写方法更严格的访问

JAVA继承中的构造方法

继承中的构造方法: //A 继承于 B //1.在new一个A之前,需要先构造一个B //2.在A的构造方法内中使用"super()"关键字先对B进行构造(需要将super关键字放在构造方法的第一行,因为只有先构造出了B之后才能进行下一步的A的构造) //3.在A构造方法中没有写super关键字的时候,编译器会自动调用父类无参的构造方法(无论父类无参构造方法有没有重写) //4.super()根据传入参数对应父类不同构造方法 //5.super()在多层子类中只是构造向上一层类中的构造

OC中自定义构造方法

格式 -(instancetype)init(){ self=[super init] if(self){ } return self; } 自定义构造方法规范 1)一定是对象方法,以减号开头 2)返回值一般是id类型 3)方法名一般以initWith开头 带参数的构造方法 -(instatncetype) initWithName:(NSString *) name andAge:(int)age{ if(self=[super init]){ _age=age; _name=name; }

Python进阶-继承中的MRO与super

摘要本文讲述Python继承关系中如何通过super()调用"父类"方法,super(Type, CurrentClass)返回CurrentClass的MRO中Type的下一个类的代理:以及如何设计Python类以便正确初始化. 1. 单继承中父类方法调用 在继承中,调用父类方法是很有必要的.调用父类方法的场景有很多: 比如必须调用父类的构造方法__init__才能正确初始化父类实例属性,使得子类实例对象能够继承到父类实例对象的实例属性: 再如需要重写父类方法时,有时候没有必要完全摒