黑马总结系列:面向对象相关

面向对象:一种编程思想。

OOA(面向对象分析)+OOD(面向对象设计)+OOP(面向对象编程)=面向对象

面向对象是针对于面向过程而言的,是一种组织代码的方式、思想。比如说吃饭——在面向过程中你需要自己去买菜、做饭,要走完做饭的流程你才能吃到饭菜,而现在有了面向对象,你就可以去一个餐馆吃饭而不需要自己动手做了,你只需要点菜给钱就行!餐馆就相当于实现做饭功能的对象,你不需要自己去做,也不用关心饭菜是通过何种方式做出来的,找个有此功能的对象(餐馆)帮你实现就行了,而对于那个对象(餐馆)而言还是要一步一步去实现的(买菜--加工)。也许这样我们并不能体会到面向对象的好处,下面继续深入,在实际生活中,你可以去中餐厅、西餐厅也可以去路边摊等地方吃饭,这样一来,在面向过程中我们得分别为每一种餐厅实现一遍做饭的方式,尽管也许它们的实现方式都一样。而在面向对象中,我们只需要声明一个具有此功能(做饭)的对象并实现此功能,让中餐厅、西餐厅等继承这个对象,那么他们也就具有了此功能(做饭)而且方式也一样,再也不需要我们单独为每一种餐馆实现功能了,而且通过重写还能让他们实现的功能方式不同!最大化让代码重用,使程序更能模拟现实生活,这就是面向对象的好处。

面向过程是解决问题的步骤,面向对象是解决问题的方案。

面向对象的三大特性:封装、继承、多态

 

封装:

将方法和属性(字段)一起包装到一个程序单元中----以类的形式呈现。通俗的说话------将东西包装到一起,然后以新的形式呈现。类体现封装的特性。

封装的好处:隐藏性息,降低程序的复杂性,提高代码的可重用性以及可维护性,数据抽象。

 

 

类是具有相同属性(字段)和共同行为(方法)的一组对象的集合(由一组对象抽象而来),是程序的基本单元。对象是实实在在存在的,它包括具体的特征(属性、字段)与行为(方法),类是模型,对象是产品,是类的实例。属性实际上是对字段进行操作的方法的封装,关于属性,不管属性是只读,只写或是可读可写,后台中都有一个与之相对应的set、get方法,可以理解为属性就是对字段进行操作(取、赋值)的方法。从Reflector中可以看到每一个读写属性都对应一个get_xxx与set_xxx方法。

构造方法作用:在声明类的实例的时候(new 对象)初始化其成员变量。类默认含有一个无参的构造方法,当手动添加有参的构造方法是会覆盖掉无参的构造方法的,因此要用无参的构造方法时需要手动添加。

关于静态成员与静态方法:

非静态成员与非静态方法是该对象独有的,静态成员与静态方法是该类的所有的对象所共用的。

访问方式:类名.静态成员或静态方法,不能通过实例对象.静态成员或静态方法来调用,静态类只能含有静态成员与静态方法。

从Reflector中能看到静态类中都有一个默认的静态构造方法(无参)——为了给静态成员变量赋初值,不能手动添加有参静态构造方法(编译时报错),而实例类则是通过默认的构造函数去给实例成员变量赋初值-所以在给实例类添加带参的构造方法时会覆盖默认的无参构造方法,当类中含有静态成员时,编译器会默认为其添加一个静态构造函数——为其静态成员变量赋初值,静态构造函数只在第一次使用的时候被调用,它只存在于静态类与有静态字段的一般类。

无论是访问实例,创建实例,使用静态成员,只要是涉及该类,就会调用静态构造方法初始化静态字段,同时,静态构造方法只会调用一次。

静态资源只有在程序结束的时候才被释放(托管代码---被系统调用,不能人为控制)。

静态类的本质: abstract +sealed 并且继承自object类

静态类的使用:工具类

sealed 两大作用:

1. 修饰的类不能被继承

2. 修饰的方法本能被子类重写

3.  sealed必须与override结合使用---父类中不能出现单独出现sealed方法

密封类的使用:在系统对该类分配了过多的“特权”时,需要把此类定义为sealed,让其无法被继承。

继承:在C#中以:实现,而java中则以extends实现

子类继承父类,将具备父类所有的特性与方法(除了构造函数)。若父类的特性与方法声明为private,则子类不能直接访问。

继承的好处:提高代码的可重用性以及可维护性,为了实现多态。继承的特称:单根性,传递性,任何数据类型都派生于object根类。

继承中构造方法的执行顺序:根类(object)->父类->子类(初始化该对象所有的成员变量)。

base的作用——制定调用父类的构造方法与成员,this的作用——制定调用本类的构造方法与成员。

访问修饰符

public 任何地方都能访问 

private 只有在本类中才能访问(字段、属性、 方法默认的默认修饰符)

protected 在本类与其子类中访问

internal 在本程序集中访问 (可认为成当前项目)(类、抽象类、接口、枚举、结构的默认修饰符)

protected internal 可由子类和跨程序集子类访问

访问修饰符注意点:

-> 子类的访问级别不能比父类的高

-> 字段与属性的访问级别不能高于对应成员的访问级别

-> 方法的访问级别不能高于参数与返回值的访问级别

类的访问修饰符只能有public和internal两种

方法的访问级别要与参数的访问级别一致

在访问成员时,通过new一个对象来访问与直接使用base、this访问意义完全不同

多态:

多种状态(以继承为前提,站在基类的角度)----原理:父类的对象指向子类的实例,在型调用其方法(virtual)时,调用的是其子类重写(override)的方法。

1.同一对象在不同情况下具备不同的特性(特征、方法)就叫多态。

比如:男人在妻子面前是丈夫,在父母面前是儿子,在儿子面前是老子。 

new关键字(运算符 声明对象) 隐藏父类方法---子类与父类存在同名的方法,系统会默认在子类同名方法前添加new,加与不加效果一样,隐藏基类方法是针对于子类方法的定义而言的(方法名与父类同名时)。

2.同一个动作,在不同的对象下,表现出不同的结果

比如:usb接口,U盘插上->存储数据,手机插上->充电或存数据,usb电灯插上->照明。。。。(new隐藏父类方法在这种情况下就不使用了)

重写基类方法override:(修饰符、方法名、返回类型、参数必须与父类的相同)

父类方法前加virtual,子类方法前加override(对应出现)----使用虚方法可以使用父类调用子类对象的重写方法(前提同名)

隐藏看类型(什么类型调什么方法),重写只管新(只看new的对象)

 

多态的实现:虚方法、抽象方法、接口

抽象方法使用场景:---虚方法与之相反

->父类方法可能永远也用不到,没有必要写出来

->父类概念太抽象,有些方法没有办法实现,就不需要写出来

->由于有这些极端,因此方法可以没有方法体(指方法后的大括号)

抽象方法(abstract)只能出现在抽象类中,并且不能用private修饰,抽象类不能实例化,子类必须实现抽象方法,除非子类也是抽象类---但是抽象类中存在默认构造方法,即使他不能被实例化(从抽象类能存在实例成员可看出)。

抽象类就是一般类多了几个抽象成员(抽象方法不能用private修饰、、需用public、protected、internal),与方法有关的都可以作为抽象类的抽象成员----方法、属性(本质--对字段的读取方法)、索引器(本质----带参数的属性)、事件的声明(本质----一个私有的委托变量加上两个方法,类似于字段与属性的关系)。

类是对一类事物的抽象(同一系列),接口是对一类能力的抽象(可能不属于一个系列),具体点就是对方法的抽象。

接口的好处:

接口的存在就是为了实现多态

接口可以解决多继承的问题

接口解决了继承体积庞大的问题

使用中可以将接口“当”作抽象类来使用(注意,仅仅是使用语法相似)

语法:

以I开头,接口中的方法不能有访问修饰符,也不能有方法体,接口中只能有无实现的方法、属性、索引器、事件。

接口使用场合:--多态实现:接口类型调用的方法是实现该接口的对象的方法与抽象类相似,抽象不同系列对象具有相同的功能时,规定不同对象具有相同的功能。

在子类实现接口时,可以把实现接口的方法重新定义成virtual,以便其派生类提供新的实现

虚方法,抽象类,接口归纳:

->设计层层递进:

继承->虚方法->抽象类->接口

在程序中实现多态时(前提:继承),需要使用父类的实例时,使用虚方法反之抽象类(同一系列),而当不同系列具有相同的功能的时候此时实现多态就要用到接口----抽象共同功能

->原则:优先选择使用接口(接口抽象更广泛)->抽象类->虚方法。

->面向对象的核心:一个思想(实现多态)一种方式(继承)三个方针(虚方法、抽象类、接口)。

->延伸:面向接口、面向抽象编程,其核心——方法、功能也是对象。

 

开放封闭原则:对扩展开放,对修改关闭——具体而言就是在扩展新的功能时,不能修改以前的代码

 

 

个人理解:三大特性都是为了提高代码的重用性与可维护性,个人认为在封装的基础上,随着程序的变化封装满足不了代码的重用或扩展于是产生出来继承,而接口则是从继承的基础之上发展而来。

 

posted @ 2012-09-18 15:41  Poller_Xie  阅读(141)  评论(0)    收藏  举报