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()方法,但弹出的是不同的子窗体。

最新文章

  1. spring 自动扫描、注册的类是否可以定义构造函数
  2. Sonar规则学习笔记
  3. Python-S13作业-day4-之登陆,管理后台
  4. pycharm常用快捷键
  5. CentOS学习笔记--SCSI 设备热插拔
  6. AR增强现实 Augmented Reality
  7. iOS开发中的测试框架 (转载)
  8. 给某个view增加颜色渐变图层
  9. jQuery表格操作
  10. 微信电脑版(Mac和Windows)安装
  11. .net的自定义JS控件,运用了 面向对象的思想 封装 了 控件(.net自定义控件开发的第一天)
  12. urllib 源码小剖
  13. Containerd 简介
  14. 004_LVS及haproxy
  15. PHP的几种输出方式
  16. Java Code Examples for org.codehaus.jackson.map.DeserializationConfig 配置
  17. 临时调用call()与apply()方法
  18. kafka linux 启动脚本 sample
  19. verilog实现的16位CPU设计
  20. 网易新闻页面信息抓取(htmlagilitypack搭配scrapysharp)

热门文章

  1. Nginx 配置 location 以及 return、rewrite 和 try_files 指令
  2. 【PP系列】SAP 取消报工后修改日期
  3. Marriage Match II 【HDU - 3081】【并查集+二分答案+最大流】
  4. GitBook &quot;How to be a programmer&quot;
  5. Arrays工具类使用与源码分析(1)
  6. 开发中遇到的相关linux问题
  7. 解决Maven项目BindingException异常
  8. Matplotlib基础使用
  9. python读取ini文件时,特殊字符的读取
  10. mitdump爬取当当网APP图书目录