Objective-C-类(static)方法、实例方法、overwrite(覆写)、属性(property)复习

先来定义一个Human父类

定义部分:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

//

//  Human.h

//  OOP

//

//  Created by jimmy.yang on 11-2-9.

//  Copyright 2011 __MyCompanyName__. All rights reserved.

//

#import <Foundation/Foundation.h>

@interface Human : NSObject {

    BOOL sex;

}

+(void) toString;

-(void) showSex;

@end

注:+(void)前的加号,就表示这一个是类方法(static 方法),而-(void)表示这是一个实例方法

实现部分:

注意:下面的 -(id) init 即为构造函数。对应的,还有一个-(void)dealloc方法用来释放资源(类似于析构函数或c#中的dispose()方法)-注:dealloc方法以后在内存管理中详细学习,这里先不管它。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

//

//  Human.m

//  OOP

//

//  Created by jimmy.yang on 11-2-9.

//  Copyright 2011 __MyCompanyName__. All rights reserved.

//

#import "Human.h"

@implementation Human

//构造函数

-(id) init

{

    NSLog(@"init() in Human is called");

    sex = TRUE;

    return(self);

}

//static类方法

+ (void)toString

{

    NSLog(@"this is a class method of Human");

}

//实例方法

- (void)showSex

{

    NSLog(@"my sex is %@",[email protected]"MALE":@"FEMALE");

}

@end

再来定义一个Woman子类

定义部分:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

//

//  Woman.h

//  OOP

//

//  Created by jimmy.yang on 11-2-9.

//  Copyright 2011 __MyCompanyName__. All rights reserved.

//

#import <Foundation/Foundation.h>

#import "Human.h"

@interface Woman : Human {

    BOOL married;

}

-(void) canCook:(NSString*) foodName;

-(void) setMarried:(BOOL)m;

-(BOOL) Married;

@end

实现部分:

注意下面的:setMarried 与 Married 就是obj-C中属性的标准写法(当然以后还能看到其它简化的写法)


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

//

//  Woman.m

//  OOP

//

//  Created by jimmy.yang on 11-2-9.

//  Copyright 2011 __MyCompanyName__. All rights reserved.

//

#import "Woman.h"

@implementation Woman

//Woman类的构造函数

-(id) init{

    NSLog(@"init() in Woman is called!");

    if (self==[super init]){

        sex = FALSE;

        married = FALSE;

    }

    return (self);

}

//overwrite父类中的toString()

+(void)toString

{

    NSLog(@"This is Woman‘s ToString()");

}

//Woman能做饭

-(void)canCook:(NSString*) foodName

{

    NSLog(@"I can cook %@",foodName);

}

//属性的setter

-(void) setMarried:(BOOL)m

{

    married = m;

}

//属性的getter

-(BOOL) Married

{

    return married;

}

@end

main方法中的调用:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

#import <Foundation/Foundation.h>

#import "Human.h"

#import "Woman.h"

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

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // insert code here...

    NSLog(@"Hello, World!");

    

    //调用类的“静态”方法

    [Human toString];

    

    NSLog(@"----------------");

    

    //创造一个Human的实例

    Human *man = [Human new];

    

    //调用man的showSex方法

    [man showSex];

    

    NSLog(@"----------------");

    

    //定义一个Woman子类的实例

    Woman *wife = [Woman new];

    [wife canCook:@"Rice"];

    

    //调用继承自父类的方法

    [wife showSex];

    

    //设置属性

    [wife setMarried:TRUE];

    

    //读取属性值

    NSLog(@"wife‘s married = %@",wife.Married==NO[email protected]"FALSE":@"TRUE");

    

    NSLog(@"----------------");

    

    //调用overwrite后的toString方法

    [Woman toString];

    

    

    //Factory模式中常用的手法,在这里依然适用(只不过编译时会有警告 ‘Human‘ may not respond to ‘-canCook:‘)

    Human *wife2 = [Woman new];

    [wife2 canCook:@"soap"];

    

    

    

    NSLog(@"----------------");

    

    [pool drain];

    return 0;

}

运行结果:

2011-02-09 17:01:02.016 OOP[1725:a0f] Hello, World!
2011-02-09 17:01:02.053 OOP[1725:a0f] this is a class method of Human
2011-02-09 17:01:02.062 OOP[1725:a0f] ----------------
2011-02-09 17:01:02.075 OOP[1725:a0f] init() in Human is called
2011-02-09 17:01:02.091 OOP[1725:a0f] my sex is MALE
2011-02-09 17:01:02.094 OOP[1725:a0f] ----------------
2011-02-09 17:01:02.099 OOP[1725:a0f] init() in Woman is called!
2011-02-09 17:01:02.104 OOP[1725:a0f] init() in Human is called
2011-02-09 17:01:02.105 OOP[1725:a0f] I can cook Rice
2011-02-09 17:01:02.108 OOP[1725:a0f] my sex is FEMALE
2011-02-09 17:01:02.109 OOP[1725:a0f] wife‘s married = TRUE
2011-02-09 17:01:02.111 OOP[1725:a0f] ----------------
2011-02-09 17:01:02.116 OOP[1725:a0f] This is Woman‘s ToString()
2011-02-09 17:01:02.120 OOP[1725:a0f] init() in Woman is called!
2011-02-09 17:01:02.121 OOP[1725:a0f] init() in Human is called
2011-02-09 17:01:02.123 OOP[1725:a0f] I can cook soap
2011-02-09 17:01:02.125 OOP[1725:a0f] ----------------

Objective-C-类(static)方法、实例方法、overwrite(覆写)、属性(property)复习,布布扣,bubuko.com

时间: 2024-10-07 10:45:14

Objective-C-类(static)方法、实例方法、overwrite(覆写)、属性(property)复习的相关文章

覆写equals方法为什么需要覆写hashCode方法

覆写equals方法必须覆写hashCode方法,是JDK API上反复说明的,不过为什么要这样做呢?这两个方法之间有什么关系呢? void test() { // Person类的实例作为Map的key Map<Person, Object> map = new HashMap<Person, Object>(); map.put(new Person("张三"), new Object()); // Person类的实例作为List的元素 List<P

11.JAVA-Object类之finalize(),clone(),toString()等方法覆写

1.Object介绍 Object类是一个特殊的类,是所有类(包括数组,接口 )的父类,如果一个类没有用extends明确指出继承于某个类,那么它默认继承Object类,所以可以通过向上转型的方法使用类型为Object的变量指向任意类型的对象. 本章主要实现覆写Object类的clone(),toString()equals(),finalize()等最重要的方法. 2.覆写finalize() 在之前我们学习析构方法时,便讲过finalize(). 参考之前学的finallize方法示例:3.

在C#中该如何阻止虚方法的覆写

在开发过程中,我们为了让一个类更有生命力,有时会用virtual来修饰一个方法好让子类来覆写它.但是如果有更新的子子类来覆写时,我们又不想让其影响到上一层的覆写,这时候就要用到new virtual来阻断覆写了. public class Animal { public virtual void WhoAmI() { Console.WriteLine("I am Animal."); } } public class Dog : Animal { public override vo

覆写、重写、多态

1.父类对象用子类对象来实例化的,那么,这个新对象只继承父类的成员,子类的成员根本没有实例化. ** 编译时已经决定左边对象的类型,右边的类型只要包含右边类就可以. 2.虚方法:virtual 他只能修饰方法的,这个虚方法是包含实现的,虚方法和抽象方法一样也可以用override来覆写. 这种功能是为将来留出了修改这个方法的可能. 3.覆写:override 当用override覆写之后原方法是已经覆盖掉了,所以不能再被执行,这时父类对象用子类对象来实例化时,对象获得不了已经被覆盖掉的原方法,只

8.2.3 覆写 Equals

经过对四种不同类型判等方法的讨论,我们不难发现不管是 Equals 静态方法.Equals 虚方法 抑或==操作符的执行结果,都可能受到覆写 Equals 方法的影响.因此研究对象判等就必须将注意 力集中在自定义类型中如何实现 Equals 方法,以及实现怎样的 Equals 方法.因为,不同的类型, 对于“相等”的理解会有所偏差,你甚至可以在自定义类型中实现一个总是相等的类型,例如: class AlwaysEquals { public override bool Equals(object

Java 覆写初探

Java 覆写 继承性的主要特征是子类可以根据父类已有的功能进行功能扩展,但是在子类定义属性或方法的时候有可能定义属性和方法和父类同名,在此类情况下就称为:“覆写”. 方法的覆写:[改良原本功能不足的方法] 子类定义的方法与父类方法名称相同.参数的类型及个数.返回值相同的方法. class A { public void fun() { System.out.println("A.fun()方法") ; } } class B extends A { public void fun()

类的继承,方法的重载和覆写

在网易云课堂上看到唐大仕老师讲解的关于类的继承.方法的重载和覆写的一段代码,注释比较详细,在此记下以加深理解. 小总结: 1.类的继承:同类可以实例化(Student t=new Student(),Person p=new Person()),人类可以强制转换为学生类(Student t=(Student)Person),人类可以是学生类(Person p=new Student()): 2.方法的重载:只要求方法名称相同,返回类型.参数数目和参数类型都可以不相同: 3.方法的覆写:只有基类中

PHP类的静态(static)方法和静态(static)变量使用介绍

PHP类的静态(static)方法和静态(static)变量使用介绍,学习php的朋友可以看下 在php中,访问类的方法/变量有两种方法: 1. 创建对象$object = new Class(),然后使用”->”调用:$object->attribute/function,前提是该变量/方法可访问. 2. 直接调用类方法/变量:class::attribute/function,无论是静态/非静态都可以.但是有前提条件: A. 如果是变量,需要该变量可访问. B. 如果是方法,除了该方法可访

C#使用基类的引用 and 虚方法和覆写方法

结论:使用基类的引用,访问派生类对象时,得到的是基类的成员. 虚方法和覆写方法