C#面向对象笔记
1、面向对象核心概念
(1)类是抽象,对象是实例,new一个对象会分配一块堆空间,对象指向该空间的地址,将对象赋值给另一个对象,只是将地址赋给它,指向的是同一块空间。
e.g.
- class Car
- {
- public string name;
- public void showName()
- {
- Console.WriteLine("这是一辆" + name);
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- Car benz = new Car();
- benz.name = "奔驰";
- benz.showName();
- Car c200 = benz;
- c200.name = "C200";
- benz.showName();
- Console.ReadKey();
- }
- }
输出:
因为c200赋值为benz时,只是将地址赋给了c200,它们指向的是同一块地址。
当没有指针指向这块堆空间时,就成为垃圾,将会被回收。
(注:C#中的string类型也是引用类型,但不会出现类似上面的情况——即string a = "1";string b = a;b = "2";//a还是1,这是因为运算符重载的结果,当b的值发生变化时,会重新为它创建一块新的堆空间,这样a和b就指向了不同的地址,实现通常语义下的字符串。
延伸:为什么说C#中的字符串对象一旦被初始化,就不能再改变这个对象的值?因为初始化后,会在堆空间中分配一块区域存放这个对象,string变量只是指向这个地址的引用,当改变这个变量时,系统会重新在堆空间中开辟一块区域放新的字符串,这个变量就指向这个新的地址,原来那个字符串对象如果没有引用指向它,将会成为垃圾被回收。字符串和普通对象不一样的地方是字符串有驻留池的概念,即创建一个字符串时,先在驻留池中寻找是否有这个字符串,如果有这个字符串变量就指向这个字符串,而不会再创建新的实例,参考:https://www.jb51.net/article/106529.htm)
(2)面向对象的作用:a.更真实的模拟现实;b.增加代码复用性。
2、封装
隐藏属性和实现细节,只能用指定的方法访问成员,增强了安全性,使用更加简单,不需要知道实现细节。
3、继承
除了构造函数和析构函数,派生类会完全继承基类的所有成员,并且具有传递性,派生类可以增加新成员,但不能减少基类的成员,只能继承一个基类,实现多继承要通过接口;
不想被其他类继承可用sealed进行修饰,sealed也能用于方法或属性,与override同时使用,可以不让派生重写这个方法或属性,抽象类不能被声明为sealed,因为它存在的意义就是为了被继承。
派生类会完成继承基类的属性和方法,包括基类是private的成员,但派生类不能访问这些private成员。(private:只有自己能访问;private protected:同一程序集中的派生类也能访问,C#7.2之后可用;protected:派生类也能访问;internal:当前程序集能访问<注意不是同一个namespace,参考:https://www.cnblogs.com/liuww/p/5335003.html;MSDN:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/internal>;protected internal:当前程序集或派生类能访问; public:谁都能访问)
4、多态
静态多态:函数重载(参数个数不同、类型不同),运算符重载
动态多态:通过继承实现不同的对象调用同一个方法时表现出不同的行为(通过override,只有抽象方法、虚方法、override方法能被override)
e.g.
- class Dog
- {
- public virtual void bark()
- {
- Console.WriteLine("狗叫。");
- }
- }
- class Puppy : Dog
- {
- public override void bark()
- {
- Console.WriteLine("小狗叫。");
- }
- }
- class Teddy : Dog
- {
- public override void bark()
- {
- Console.WriteLine("泰迪叫。");
- }
- }
输出:
注:winform中弹出一个新的窗体时就经常用到多态 e.g. Form form = new UserForm();form.show();Form是父类,用不同的子类实例化一个Form,同样调用的是show()方法,但弹出的是不同的子窗体。
C#面向对象笔记的更多相关文章
- JS面向对象笔记二
菜单导航,<JS面向对象笔记一>, 参考书籍:阮一峰之<JavaScript标准参考教程> 一.构造函数和new命令 二.this关键字 三.构造函数和new命令 四.构造函 ...
- PHP面向对象笔记解析
PHP的面向对象是很重要的内容,也是很常用的内容.所以现在就把PHP面向对象进行整理了一下. 顺带,我会在后面把我整理的一整套CSS3,PHP,MYSQL的开发的笔记打包放到百度云,有需要可以直接去百 ...
- Python 面向对象笔记
Python 面向对象课程笔记 前言 Python 面向对象 正文 基本概念 什么是对象: 万物皆对象 对象是具体物体: 拥有属性 拥有行为 封装零散为整体 OOP(Object Oriented P ...
- js面向对象笔记
JavaScript 私有成员实现 到此为止,如果您任然对 JavaScript 面向对象持怀疑态度,那么这个怀疑一定是,JavaScript 没有实现面向对象中的信息隐藏,即私有和公有.与其他类式面 ...
- python 面向对象-笔记
1.如何创建类 class 类名: pass class bar: pass 2.创建方法 构造方法,__init__(self,arg) obj = 类('a1') 普通方法 obj = 类(‘xx ...
- [52PJ] Java面向对象笔记(转自52 1510988116)
面向对象概念 面向对象三大特征:封装,继承,多态 面向对象编程(OOP,Object Oriented Programing)是相对于面向过程编程说的,之前写的代码基本都是纯的面向过程编程的,当项目复 ...
- 2019/1.7 js面向对象笔记
面向对象 1.构造函数里的属性怎么看?看this,谁前面有this谁就是属性. num不是属性,是私有作用域下的私有变量. 2.如何查找面向对象中的this 1.构造函数的this指向实例对象 2.如 ...
- Java面向对象笔记(五分钟秒懂)
面向对象概念 面向对象三大特征:封装,继承,多态 面向对象编程(OOP,Object Oriented Programing)是相对于面向过程编程说的,之前写的代码基本都是纯的面向过程编程的,当项目复 ...
- JavaScript高级特征之面向对象笔记
Javascript面向对象 函数 * Arguments对象: * Arguments对象是数组对象 * Arguments对象的length属性可以获取参数的个数 * 利用Arguments对象模 ...
随机推荐
- 设计模式 - 建造者模式 Builder Pattern
简介 场景 在创建复杂对象时,用户无须关心该对象所包含的属性以及它们的组装方式,只需要指定复杂对象的类型和内容就可以构建它们. 模式定义 建造者模式:将一个复杂对象的构建与表示分离,使得同样的构建过程 ...
- js面向对象程序设计之属性和对象
写在博客之前的话,这是我这个刚毕业的菜鸟的第一篇博客.一口吃不成一个胖子,我也希望写的第一篇东西就让读的人醍醐灌顶.我会抱着怀疑的态度来看自己写的文章,如果有写错的地方,请大家不要被误导,如果有大神提 ...
- AtCoder ABC 140D Face Produces Unhappiness
题目链接:https://atcoder.jp/contests/abc140/tasks/abc140_d 题目大意 有一对 N 个人, 用字符串 S 表示, S[i] 如果等于 'L' 说明这个人 ...
- [Linux] 017 网络命令与挂载命令
1. 网络命令:write 命令名称:write 命令所在路径:/usr/bin/write 执行权限:所有用户 语法:write [用户名] 功能描述:给用户发信息,以 Ctrl-d 保存结束 范例 ...
- Codeforces 1105D (BFS)
题面 传送门 分析 考虑BFS while(棋盘没有满){ for 玩家 p{ 对p进行BFS,走s[p]步 } } 对于每个玩家p BFS的时候如果到了格子(x,y),就把\(vis[x][y]\) ...
- P5030 长脖子鹿放置
题目背景 众周所知,在西洋棋中,我们有城堡.骑士.皇后.主教和长脖子鹿. 题目描述 如图所示,西洋棋的"长脖子鹿",类似于中国象棋的马,但按照"目"字攻击,且没 ...
- python 字符编码问题总结
都是计算机存储是二进制0101之类的数字 最早计算机在美国开始的 所以数字和英文之类的占用八位 2的8次方 256可以存储对于英文和数字戳戳有余 每个国家都有自己的编码 中国 gb2312 gbk ...
- Gradle 入门--只此一篇
是什么? 在语法上是基于Groovy语言的(Groovy 是一种基于JVM的敏捷开发语言,可以简单的理解为强类型语言java的弱类型版本),在项目管理上是基于Ant和Maven概念的项目自动化建构工具 ...
- SQL 查询 group by 的使用注意点
今天用SQL Server尝试实现一个SQL语句的时候,报了如标题所示的错误,通过在百度里面搜索,并亲自动手实现,终于发现问题所在,现在把它记录下来. 语句如下: select [OrderI ...
- JVM(12)之 可视化分析工具
开发十年,就只剩下这套架构体系了! >>> 经过前几篇博文对堆内存以及垃圾收集机制的学习,相信小伙伴们已经建立了一套比较完整的理论体系!本篇博客就根据已有的理论知识,通过可视化工 ...