1.什么是面向对象? 面向对象就是找对象帮你做事。下面来举个例来说明一下什么是面向对象 例子: 今天去吃早餐: 找到你的对象:买煎饼大婶 找到对象 告诉她,阿姨来一煎饼 要求对象 她把煎饼给你 得到结果 假设时间推迟到了500年左右:这里说明一下面向过程 找米,洗米,生火,米+水放进去,添柴,等,吃。这一系列动作都是自己来完成。这就 是面向过程。(你要说500年那时也有煎饼卖,那你纯属跟我抬杠) 2.在代码中实现面向对象 根据任务找对象,代码中有对象吗?使用的时候,根据"模板"创建对应的对象,这个模板就是类 微软已经提供好的类例如:Random r = new Random(); // 创建了一个可以产生随机数的对象 int num = r.Next(10); // 告诉代码要产生一个0到9的随机数 自己写个类,自己创建一个对象 [public] class 类名 { // 成员 public void Func() { Console.WriteLine("我是一个类的方法"); } } 类名 <变量> = new 类名(); // 创建对象 使用对象的方式,通过调用方法或属性来实现 <变量>.Func(); 3.类的成员 类是对象的模板,变量,存储描述对象的数据 字段 对象的功能用方法来描述 方法 提供字段访问的方式 属性 构造方法提供初始化 4.部分类 部分类使用场景:当你要对你过去编写的类进行扩展的时候可以使用部分类。 部分类只是实现编码的组织方式,在编译成程序集的时候, 部分类说明: 当一个类写完以后,测试稳定后尽量不要修改其代码 如果将来需要扩展改类的内容,一般使用部分类来实现 部分类只是实现编码的组织方式,在编译成程序集的时候,计算机视为一个类 也就是说可以将一个类写在多个文件中的方法 部分类语法:partial class 类名 5.构造方法: 作用:构造方法是为了是在创建对象的时候初始化字段,就是给字段赋值默认值。 种类:默认无参构造方法 如果用户提供了构造方法就没有默认无参构造方法。 构造方法可以重载。 调用:只有在new对象的时候才能显示调用构造方法。 New 类名(); 关于构造方法的访问级别:public private 不写默认就是private 属性: 属性不具备存储数据的能力(属性的存在一定有一个后台的字段) 属性本质就是方法 自动属性实际与普通属性一样,只是由系统自动生成了后台字段 自动属性没有所谓的只读只写之分,必须是可读可写 当对象不需要考虑字段约束时,可以用自动属性 6.静态类与静态成员 生命周期 从第一次访问开始,到程序结束 存储方式(难) 使用的方式 定义:加static 静态的类 public static class 类名{} 静态的成员: Private static int num; 使用: 静态类不存在使用的问题 静态成员的使用:类名.成员名 什么时候考虑用静态 使用静态一般就是在考虑使用静态成员 最大的区别就是实例化,所以一般静态提供的是功能的方法或长久不变的常量 静态类:对于一个类,如果提供的都是静态成员就可以直接将其写成静态类 静态的全局性什么意思 静态表示一开始就有,一直可以用到程序结束 静态成员共有的,是共享的 初始化 静态构造方法 没有参数 无法显示调用,只有在程序第一次访问这个类的时候,自动调用 第一次访问:①第一次访问静态成员 ②第一次访问实例成员 继承:主要学习 ① 什么是继承,如何实现 ② 构造方法的执行顺序 ③ 里氏转换原则 7.什么是继承 就是把一个类包含进来 在继承中的特征 单根性:只允许有一个父类 传递性:爷爷有的孙子也有 基类object:任何类型直接或者间接继承于object(核心) This与base 凡是是父类的字段用base.字段名 凡是是自己的字段用this.字段名 其实是一个意思。。。 is 运算符与 as 运算符 -> is 专门判断一个对象是否可以转换成指定类型 bool 对象 is 类型 既然判断了,就是要转换后使用 if(对象 is 类型) { 目标对象 = (目标类型)对象; } else { 目标对象 = null; } -> as 目标类型 目标变量 = 对象 as 类型; // 如果对象可以转,就转换,并赋值给左边,否则赋值为null 构造方法的执行顺序 默认情况构造方法执行顺序 继承中构造方法的顺序先执行无参的父类的构造方法 然后再执行子类中的构造方法。 为什么先调用父类的构造方法 因为构造方法 开辟空间 也就是说new了后才能赋初值 8.多态 里氏转换原则-> 目的就是为了实现多态 ①子类对象可以直接赋值为父类变量 Person p=new Student(); Student stu=new Student(); Person p=stu; ② 指向子类对象的父类变量,可以强制类型转化为对应的子类对象 也就是说必须要满足第一条 Student stu1=(Student)p ; Student stu1 = p as Student; 父类掉用子类方法 一个是对象不变 一个是对象内核在变 里氏转换原则的使用——多态 -> 什么叫多态 -> 男人是什么? -> 人 -> 丈夫 -> 父亲 -> 员工 ----------------------- zhangsan zjy = new ZhaoJianYu(); zjy.Role(); // 我是张三 Person p = (Person)zjy; p.Role(); // 我是人 Husband hu = (Husband)zjy; hu.Role(); // 我是老公 无论谁都应该可以调用Role()方法 -> 将USB设备插入计算机会怎么样? 电扇 .插入() 凉快了 灯 .插入() 天亮了 U盘 .插入() 数据传输了 三个对象不能统一调用,继承与同一个父类 1、在父类方法中加virtual 2、在子类方法中加override -> 如何实现多态 -> 继承是多态实现的前提,里氏转换时多态实现的条件 -> 基本步骤 -> 写一个父类 -> 写子类 -> 有同名同参的方法(完全一样的方法) -> 添加修饰符(new 系, virtual+override 系) -> 使用都是创建子类交给父类使用 同一个对象,表现的不同形态。 隐藏基类方法 重写基类方法 9.抽象方法 -> 有时就是为了多态,不需要父类方法有方法体,那就不用写方法体 有时不知道父类方法该怎么写,不用写 -> 就是方法没有方法体,在方法前加上一个 abstract public void Func() { // 空实现的方法 } public abstract void Func(); // 没有方法体 -> 将方法定义为抽象的,就是告诉用户有一个方法了,可以去调用 但是这个方法必须由子类重写才行,否则没有实现过程 -> 抽象方法怎么用 -> 定义 抽象方法只允许在抽象类中(难点) abstract class MyClass {} 抽象类就是为了多态而存在,抽象类不能实例化(new 对象) -> 使用 -> 抽象法在子类中必须实现,除非子类也是抽象方法 -> 如何重写 public override void Func() { // 方法体 } -> 调用的时候与虚方法一样 10、 抽象类 -> 就是为了多态而存在的 -> 抽象类的写法 加 abstract 就可以了 -> 抽象类的成员有哪些 -> 同样也是描述对象的,但是描述对象的时候上升到了一个概念的层次 -> 抽象类比一般类多抽象成员 -> 抽象成员有哪些呢?(抽象方法) -> 抽象的方法 -> 抽象的属性 -> 抽象的索引 -> 抽象的事件 -> 总结 抽象类比一般类多 abstract 和 抽象成员 凡是和方法可以对上号的都可以有抽象的版本 -> 子类如何实现 -> override 就可以了 -> 补充: 重写过的方法,还可以被子类重写 -> 构造方法 -> 有没有构造方法 -> 但是构造方法不能被 new 调用,只能有子类 :base 调用 -> 抽象类的构造方法一般是 protected 11.抽象属性 是用来来描述事物特征 自动属性与抽象属性 不同点: 自动属性是有系统自动生成字段,因此get,set必须成对出现,表示字段可以使用 抽象属性中的get,set表示的实际上是抽象的方法,其作用是告诉子类具有什么样的方法,是可读的属性还是可读可写的属性 12.多态再次说明:说明多态在面向对象的重要性 什么是多态,就是一个对象表现出来多种形态, 这个一个对象可以从2个角度去看: 外界人的角度去看:好比说我现在有一个黑盒子,黑盒子里面有一个按钮,我在黑盒子里面放什么,我按下按钮,它就做什么事情,这个按钮没有变化过,这就是说同一个对象同一个动作表现出不同的现象。 从内部观点来:这个对象是没有变的,你new 出来的,这个是根据外部环境发生变化引起。比如这里有一个馒头你放到锅里去蒸,它就变成熟馒头,你放在水里面煮它就变成泡馒头,它这个对象没有改变,当你赋值给指定父类对象时,类型发生了变化。 再举例说明一下: 什么是多态,就是一个对象表现出来多种形态, 这个一个对象可以从2个角度去看: 外界人的角度去看:好比说我现在有一个黑盒子,黑盒子里面有一个按钮,我在黑盒子里面放什么,我按下按钮,它就做什么事情,这个按钮没有变化过,这就是说同一个对象同一个动作表现出不同的现象。 从内部观点来:这个对象是没有变的,你new 出来的,这个是根据外部环境发生变化引起。比如这里有一个馒头你放到锅里去蒸,它就变成熟馒头,你放在水里面煮它就变成泡馒头,它这个对象没有改变,当你赋值给指定父类对象时,类型发生了变化。 这就是所谓的隐藏基类方法 和重写基类方法 说说多态在工作中的运用场景,比如你项目运行时你要更换你的数据库,这时你就按照你原来写的接口,实现下接口就行了。 |
面向对象-个人看法

最新推荐文章于 2024-11-14 20:02:46 发布
