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#面向对象笔记的更多相关文章

  1. JS面向对象笔记二

    菜单导航,<JS面向对象笔记一>,  参考书籍:阮一峰之<JavaScript标准参考教程> 一.构造函数和new命令 二.this关键字 三.构造函数和new命令 四.构造函 ...

  2. PHP面向对象笔记解析

    PHP的面向对象是很重要的内容,也是很常用的内容.所以现在就把PHP面向对象进行整理了一下. 顺带,我会在后面把我整理的一整套CSS3,PHP,MYSQL的开发的笔记打包放到百度云,有需要可以直接去百 ...

  3. Python 面向对象笔记

    Python 面向对象课程笔记 前言 Python 面向对象 正文 基本概念 什么是对象: 万物皆对象 对象是具体物体: 拥有属性 拥有行为 封装零散为整体 OOP(Object Oriented P ...

  4. js面向对象笔记

    JavaScript 私有成员实现 到此为止,如果您任然对 JavaScript 面向对象持怀疑态度,那么这个怀疑一定是,JavaScript 没有实现面向对象中的信息隐藏,即私有和公有.与其他类式面 ...

  5. python 面向对象-笔记

    1.如何创建类 class 类名: pass class bar: pass 2.创建方法 构造方法,__init__(self,arg) obj = 类('a1') 普通方法 obj = 类(‘xx ...

  6. [52PJ] Java面向对象笔记(转自52 1510988116)

    面向对象概念 面向对象三大特征:封装,继承,多态 面向对象编程(OOP,Object Oriented Programing)是相对于面向过程编程说的,之前写的代码基本都是纯的面向过程编程的,当项目复 ...

  7. 2019/1.7 js面向对象笔记

    面向对象 1.构造函数里的属性怎么看?看this,谁前面有this谁就是属性. num不是属性,是私有作用域下的私有变量. 2.如何查找面向对象中的this 1.构造函数的this指向实例对象 2.如 ...

  8. Java面向对象笔记(五分钟秒懂)

    面向对象概念 面向对象三大特征:封装,继承,多态 面向对象编程(OOP,Object Oriented Programing)是相对于面向过程编程说的,之前写的代码基本都是纯的面向过程编程的,当项目复 ...

  9. JavaScript高级特征之面向对象笔记

    Javascript面向对象 函数 * Arguments对象: * Arguments对象是数组对象 * Arguments对象的length属性可以获取参数的个数 * 利用Arguments对象模 ...

随机推荐

  1. pandas 增删改查

    原文链接:https://blog.csdn.net/zhangchuang601/article/details/79583551 准备工作:增.删.改.查的方法有很多很多种,这里只展示出常用的几种 ...

  2. 16/7/11_PHP-日期和时间

    取得当前的Unix时间戳 UNIX 时间戳(英文叫做:timestamp)是 PHP 中关于时间与日期的一个很重要的概念,它表示从 1970年1月1日 00:00:00 到当前时间的秒数之和. PHP ...

  3. Cordova指令

      安装 cordova: npm install -g cordova 创建应用程序 cordova create hello com.example.hello HelloWorld cordov ...

  4. [LeetCode] 137. Single Number II (位操作)

    传送门 Description Given an array of integers, every element appears three times except for one, which ...

  5. 远程操作 SQl server2008新建角色和数据库

    远程操作 SQl server2008 1.windows身份登录,安全性-->登录名(右键)-->新建登录名:yc ,密码111111-->点选sql server身份验证--&g ...

  6. 排序算法一:插入排序(Insertion sort)

    最近从网易公开课在看麻省理工学院的公开课<算法导论>,感觉还不错,接下来几篇文章所示学习日记了,不准备对算法细节做过多描述,感兴趣的可以自己去看. 文章分几篇讲经典排序算法,直接上代码,根 ...

  7. UI自动化处理文件上传

    UI自动化处理文件上传 import win32guiimport win32con def set_uploader(self, file_path): sleep(2) self.file_pat ...

  8. C++中的布尔类型和引用

    1,C++ 中的布尔类型: 1,C++ 在 C 语言的基础类型系统之上增加了 bool: 1,C 语言中,没有 bool 类型存在,往往都是用整型代替 bool 类型,常用 0 表示假,用 1 表示真 ...

  9. P5030 长脖子鹿放置

    题目背景 众周所知,在西洋棋中,我们有城堡.骑士.皇后.主教和长脖子鹿. 题目描述 如图所示,西洋棋的"长脖子鹿",类似于中国象棋的马,但按照"目"字攻击,且没 ...

  10. luoguP2123 皇后游戏(贪心)

    luoguP2123 皇后游戏(贪心) 题目 洛谷题目chuanso 题解 有一篇好题解,我就懒得推式子了,毕竟打到电脑上还是很难的 牛逼题解传送门 code #include<iostream ...