1.关于.h和.m文件:
.h 接口文件 .m 实现文件
接口只是对类中的类属性和方法进行定义和声明 @interface
@interface 类名 :(继承)NSObject
实现负责类中的方法的具体实现的过程和属性的赋值 @implementation
2.封装安全性:
@private 作用范围是:本身
@protected 作用范围是:自身和子类
@public 作用范围是:全部
3.类方法和对象方法的区别:
类方法:+(返回值类型) 方法名称:(参数类型)参数
注意:类方法不能设置类属性(实例变量)
对象方法:-(返回值类型) 方法名称:(参数类型)参数
对象方法才可以设置类属性
注意:参数类型要一样
4.继承结论:
(1)、子类继承父类,当都拥有相同的方法优先调用自己定义的方法
(2)、即使子类没有定义这个方法,编译器会去父类找这个方法的声明,注意:但是具体方法的实现,还是优先找自己的实现的方法。
(3)、如果直接调用父类的方法,而父类没有声明这个方法的时候,编译器不会去找子类,也就是会报错!
继承可以实现,但是需要事先引用父类的头文件
@interface 子类 :(继承) 父类
子类继承父类,特性如下:
(1)、可以使用父类的所有的方法
注意:子类用父类的方法,需要用super,使用自己的方法用self,默认如果不用 关键字,先用自己的。
(2)、可以使用父类的所有的属性
5.多态
一句话概括多态: 父类指针可以指向子类对象,也可以指向父类对象
具体实例
main.m
#import <Foundation/Foundation.h>
#import "Car.h"
#import "PassengerCar.h"
#import "Truck.h"
int main() {
//实例化car对象,并设置相关值
Car *car = [[Car alloc]init];
[car setName:@"小汽车"];
[car setWheelNumber:4];
[car setSpeed:60];
//实例化passengerCar对象,并设置相关值
PassengerCar *passengerCar = [[PassengerCar alloc]init];
[passengerCar setName:@"客车"];
[passengerCar setWheelNumber:8];
[passengerCar setSpeed:80];
[passengerCar setSeatNumber:47];
//实例化truck对象,并设置相关值
Truck *truck = [[Truck alloc]init];
[truck setName:@"货车"];
[truck setWheelNumber:4];
[truck setSpeed:60];
[truck setTruckWeight:1000];
[car describe:car];
[passengerCar describet:passengerCar];
[truck describes:truck];
// //第二种情况调用
// [car describe:car];
// [car describe:passengerCar];
//
//第三种情况调用
// [passengerCar describes:car];
// [passengerCar describes:passengerCar];
}
car.h
#import <Foundation/Foundation.h>
//#import "PassengerCar.h"
@interface Car : NSObject
{
NSString * _name;
int _wheelsNumber;
int _speed;
}
-(void) setName :(NSString *) name;
-(NSString *) name;
-(void) setWheelNumber : (int) wheelsNumber;
-(int) wheels;
-(void) setSpeed : (int) speed;
-(int) speed;
//第一种情况,多态方法在父类中,传递参数类型是Car(父类)类型,此时调用时的对象可以是父类对象,也可以是子类对象。
-(void) describe : (Car *)car;
//第二种情况,多态方法在父类中,传递参数类型是Passenger(子类)类型,此时调用时的对象可以是父类对象,也可以是子类对象。
//-(void) describes : (PassengerCar *)passenger;
@end
car.m
#import "Car.h"
@implementation Car
-(void)setName:(NSString *)name
{
_name = name;
}
-(NSString *)name
{
return _name;
}
-(void)setWheelNumber:(int)wheelsNumber
{
_wheelsNumber = wheelsNumber;
}
-(int)wheels
{
return _wheelsNumber;
}
-(void)setSpeed:(int)speed
{
_speed = speed;
}
-(int)speed
{
return _speed;
}
-(void) describe : (Car *)car;
{
NSLog(@"%@的轮子数是%i,车速是%i",_name,_wheelsNumber,_speed);
}
@end
passangerCar.h
#import <Foundation/Foundation.h>
#import "Car.h"
@interface PassengerCar : Car
{
int _seatNumber;
}
-(void) setSeatNumber : (int) seatNumber;
-(int)seatNumber;
//调用父类的多态方法
-(void) describet : (Car *)car;
////第三种情况,多态方法在子类中,传递参数类型是Car(父类)类型,此时调用时的对象只能是子类对象。
//-(void) describes : (Car *) passengerCar;
@end
passengerCar.m
#import "PassengerCar.h"
@implementation PassengerCar
-(void)setSeatNumber:(int)seatNumber
{
_seatNumber = seatNumber;
}
-(int)seatNumber
{
return _seatNumber;
}
// 父类多态方法的调用,可输出子类和继承的父类的属性
-(void) describet : (Car *)car;
{
NSLog(@"%@的轮子数是%i,车速是%i,座位数是%i",_name,_wheelsNumber,_speed,_seatNumber);
}
@end
truck.h
#import <Foundation/Foundation.h>
#import "Car.h"
@interface Truck : Car
{
int _weight;
}
-(void)setTruckWeight : (int) weight;
-(int) weight;
//调用父类的多态方法
-(void) describes : (Car *)car;
@end
truck.m
#import "Truck.h"
@implementation Truck
-(void)setTruckWeight : (int) weight
{
_weight = weight;
}
-(int) weight
{
return _weight;
}
// 父类多态方法的调用,可输出子类和继承的父类的属性
-(void) describes : (Car *)car;
{
NSLog(@"%@的轮子数是%i,车速是%i,载重量是%i",_name,_wheelsNumber,_speed,_weight);
}
@end