1.继承
(1)创建子类对象的时候,在子类对象中会为子类对象的字段开辟空间,也会为父类的所有字段开辟空间,只不过父类私有的成员访问不到
(2)子类从父类继承父类所有的非私有成员,但是父类的所有字段也会创建,只不过父类私有的成员访问不到
(3)base关键字可以调用父类的非私有成员
(4)子类的访问级别不能比父类高,原因是访问子类的同时也访问了父类,如果子类的访问级别不能比父类高,就矛盾了
(5)创建子类的时候,会先调用子类的构造函数,然后调用父类的构造函数,然后执行父类的构造函数,最后再执行子类的构造函数
(6)子类的构造函数后面默认加了一个:base()通过这个调用父类的无参构造函数,如果父类没有无参数的构造函数,将会报错,因为子

类的构造函数默认会调用父类的无参数的构造函数
(7)使用base关键字可以显示的指定子类构造函数调用父类的构造函数
(8)继承的特征:
单根性:类只能有一个父类
传递性:子类继承父类所有的非私有成员
(9)父类与子类存在同名成员的时候,如果创建一个子类对象,调用这个子类对象的同名方法会调用子类的
(10)new关键字的第2作用隐藏父类的同名成员

2.里氏替换原则LSP
子类可以替换父类的位置,并且程序的功能不受影响
Person p = new Student();
p.SayHi();//这个是调用Person的SayHi()

如果一个父类变量指向的是子类对象,将这个父类对象转换为子类对象不会报错
Person p = new Student();
Student s = (Student)p;这种类型转换不会报错

如果一个父类变量指向的就是一个父类对象,将这个父类对象转换为子类对象会报错
Person p = new Person();
Student s = (Student)p;这种类型转换会报错

3.虚方法 virtual关键字
如果子类重写了父类的虚方法,那么通过父类变量来调用这个方法的时候会调用子类的,如果没有,则会调用父类的

4.多态
同一种行为,对于不同的事物,有不同的表现形式
多态的表现形式之一:将父类类型作为方法的参数,屏蔽多个子类的不同,将多个子类当成父类来统一处理
多态的表现形式之二:将父类类型作为方法的返回值

5.抽象类、抽象方法
(1)抽象方法用abstract关键字修饰,抽象方法不能有方法体,抽象方法必须在抽象类中
(2)抽象类不能实例化,因为有抽象成员,而抽象成员没有方法体的
(3)如果子类继承抽象类,子类必须重写父类的抽象方法
(4)抽象类中可以拥有非抽象成员,为了继承给子类
(5)当子类必须重写父类的方法或者父类没有必要实例化就用抽象类

6.Equals
object类里面的equals方法是比较两个对象的引用地址,如果引用地址是一样的返回true
string str1 = "abc";
string str2 = "abc";
str1.Equals(str2);//返回True,这个Equals方法是string类的,string类的Equals方法是比较两个字符串的内容是否相同

int a = 1;
int b = 1;
a.Equals(b);//返回True
值类型Equals方法比较的是两个结构对象里字段的值(这个时候不存在重写,只是值类型自己新增的一个Equals方法)
所以:
引用类型的Equals方法默认比较的是两个对象的引用地址
string类型,值类型的Equals方法比较的是两个结构对象里字段的值

7.接口
(1)接口表示具有某种能力
(2)接口的本质是一个特殊的抽象类
(3)接口中的成员默认就是抽象的
(4)接口中只能定义方法、属性、事件、索引器
(5)接口中抽象成员不能有访问修饰符,默认就是public
(6)接口就是一个纯粹的为了规范实现类的
(7)string Name{get;set;}这个在接口中不是一个自动属性,是一个普通的属性,只不过get set方法没有实现
(8)什么时候使用抽象类:可以找到父类,并且希望通过父类继承给子类一些成员
什么时候使用接口:多个类具有相同的方法,但是却找不出父类
(9)显示实现接口:是为了解决方法名冲突的问题,显示实现的接口的方法是私有的,所以不能通过对象的变量来调用
(10)显示实现接口:这个接口的实现方法只能通过接口变量来调用
(11)要避免定义多功能接口,以免造成接口污染

8.装箱拆箱
装箱:值类型转化为引用类型int i = 12; object obj = i;
拆箱:引用类型转换为值类型 int j = (int)obj;
装箱和拆箱是比较消耗性能的,要尽量去避免装箱和拆箱操作

(1).装箱、拆箱必须是: 值类型→引用类型 或 引用类型→值类型。
int类型为什么能装箱到object类型,但不能装箱到string类型或Person类型,因为object类型是int类型的父类。
(2).拆箱时,必须用装箱时的类型来拆箱
装箱时如果是int,拆箱必须用int,不能用double
(3).方法重载时,如果具有该类型的重载,那么就不叫拆箱或装箱。
int n=10; Console.WriteLine(n);//没有发生装箱,因为方法重载。Console.WriteLine(int n);方法重载
//这个不叫装箱
int x=100;
string s=x.ToString();
(4).将值类型转换为引用类型(int→object)的时候,性能影响很大。一倍。
装箱:将值类型转换为引用类型。
拆箱:将引用类型转换为值类型。
(5).接口与值类型之间的装箱和拆箱
int n = 10;
IComparable compar = n; //装箱。
(6). string s1 = "a";
string s2 = "b";
int n3 = 10;
double d4 = 99.9;
string result = string.Concat(s1, s2, n3, d4);//string.Concat(string str0,string str1,string str2,string str3)
//Q1:有没有发生装箱? 有!
//Q2:如果有,发生了几次? 2
Console.WriteLine(result);

int n = 10;
string s1 = n.ToString();//没有发生装箱,因为Int32重写了从父类(ValueType)继承下来的ToString()方法,现在这个ToString()方法已经是Int32自己的了。
string s2 = n.GetType().ToString();//这里发生了装箱,在调用GetType()方法时发生了装箱,因为GetType()是从Object继承过来的,要调用这个方法必须通过object对象调用。所以要先装箱。
Console.WriteLine(s1 + "\t\t\t" + s2);

9.字符串
(1)字符串是特殊的引用类型
(2)字符串我们可以看做是一个字符数组string str = "abcd";char c = str[0];
(3)字符串对象一旦创建,这个对象就不能被修改
(4)在创建一个字符串对象的时候,会先去字符串拘留池中寻找是否有相同字符串内容的对象,如果有就直接让变量指向这个对象,如果没

有再创建新的对象
比如:string s1 = "a"; string s2 = "b"; s1 = "b"; s1的引用地址和s2的引用地址是相同的,都指向字符串拘留池中的“b”,不会再创

建一个“b”
(5)字符串对象一旦创建,不会被GC回收,因为微软就认为字符串是常用的
(6)字符串常用的方法、属性:
String s = new String(new char[]{'a','b'});//构造函数只能传递字符数组
int i = s.Length
string s = string.Empty代表一个空的字符串 "",不是指的null string.Empty等于"",推荐使用string.Empty;为了防止不会写错
int i = string.Compare(s1,s2);比较两个字符串的大小,返回-1,0,1
string s = string.Concat(s1,s2)连接字符串并组成一个新的字符串
bool b = s.Contains("ab");判断字符串里面是否包含指定的字符串
b = s.EndWith("b");判断字符串是否以指定的字符串结尾
b = s.StartsWith("a");判断字符串是否以指定的字符串开始
int i = s.IndexOf('a');查找指定的字符或者字符串在字符串中的索引,如果没有返回-1
int i = s.LastIndexOf('!');从字符串的结尾往前面查,第一次字符串出现的索引
string s = s.Insert(1,"c");在字符串的指定位置插入字符串
char[] c = s.ToCharArray()将字符串转换为字符数组
还有好多方法就不写了
(7)StringBuilder
StringBuilder这个类的对象是可变的,当改变这个对象的字符串时,不会新开辟空间,而是直接改变。

10.Stopwatch watch = new Stopwatch();//计时器
watch.Start();
watch.Stop();
watch.ElapsedMilliseconds毫秒数

.net学习之继承、里氏替换原则LSP、虚方法、多态、抽象类、Equals方法、接口、装箱拆箱、字符串的更多相关文章

  1. 深入理解JavaScript系列(8):S.O.L.I.D五大原则之里氏替换原则LSP

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第3篇,里氏替换原则LSP(The Liskov Substitution Principle ). 英文原文:http ...

  2. 里氏替换原则LSP(继承规范)

    继承的优点: 1.代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性. 2.提高代码的重用性. 3.子类可以形似父类,但又异于父类. 4.提高代码的可扩展性,实现父类的方法就可以“为所欲为” ...

  3. 里氏替换原则(LSP)

    替换原则由MIT计算机科学实验室的Liskov女士在1987年的OOPSLA大会上的一篇文章中提出,主要阐述有关继承的一些原则,故称里氏替换原则. 2002年,Robert C.Martin出版了一本 ...

  4. 架构师之路——里氏替换原则LSP

    定义: 如果对每一个对类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型. 内容: 里氏替换原则通 ...

  5. "围观"设计模式(2)--里氏替换原则(LSP,Liskov Substitution Principle)

    在面向对象的程序设计中.里氏替换原则(Liskov Substitution principle)是对子类型的特别定义.它由芭芭拉·利斯科夫(Barbara Liskov)在1987年在一次会议上名为 ...

  6. IOS设计模式的六大设计原则之里氏替换原则(LSP,Liskov Substitution Principle)

    定义 里氏替换原则的定义有两种,据说是由麻省理工的一位姓里的女士所提出,因此以其名进行命名. 定义1:如果对一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1所定义的程序P中在o1全都替换 ...

  7. 【C#小知识】C#中一些易混淆概念总结(六)---------解析里氏替换原则,虚方法 分类: C# 2014-02-08 01:53 1826人阅读 评论(0) 收藏

    目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...

  8. 六大设计原则(二)LSP里氏替换原则

    里氏替换原则LSP(Liskov Subsituation Principle) 里氏替换原则定义 所有父类出现的地方可以使用子类替换并不会出现错误或异常,但是反之子类出现的地方不一定能用父类替换. ...

  9. 设计模式学习--面向对象的5条设计原则之Liskov替换原则--LSP

    一.LSP简介(LSP--Liskov Substitution Principle): 定义:如果对于类型S的每一个对象o1,都有一个类型T的对象o2,使对于任意用类型T定义的程序P,将o2替换为o ...

随机推荐

  1. ETHERNET数据包格式( IP & UDP & ICMP & ARP )

    ETHERNET数据包格式( IP & UDP & ICMP & ARP ) ETHERNET数据包格式 一.ETHERNET 数据包的协议类型 TYPE 的值为 0x0800 ...

  2. C++ 中宏的使用 --来自:http://blog.csdn.net/hgl868/article/details/7058906

    宏在代码中的使用实例: g_RunLog2("Middleware client for Linux, build:%s %s", __DATE__, __TIME__); 下面详 ...

  3. C++标准库异常类

    C++标准库异常类 2012-12-24 16:27 5269人阅读 评论(1) 收藏 举报  分类: c/c++(36)  C++标准库异常类继承层次中的根类为exception,其定义在excep ...

  4. C/C++内存分配区

    一.起源 C++内存分成5个区,分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 但这个自由存储区这么一听还是模模糊糊的,和堆好像是一样的,还有同学说起这个问题.   二.个人理解 关于自由存 ...

  5. 如何在windows中编写R程序包(转载)

    网上有不少R包的编译过程介绍,挑选了一篇比较详细的,做了稍许修改后转载至此,与大家分享 如何在windows中编写R程序包 created by helixcn modified by binaryf ...

  6. 混合应用中的javascript实践

    混合应用中的javascript实践 混合应用(hybird app) 在几年前便进入大众视野,近来更是越发风生水起,深受人民群众的喜爱. 目录 概念 什么是混合应用 混合方式 交互 方法注入 参数传 ...

  7. $gte 必须使用双引号,且冒号后面不能有空格

    pry(main)> puts "showlastupdate:{\"$gte\":\"#{Date.today.to_s(:number)}\" ...

  8. 学习windows内核书籍推荐 ----------转自http://tieshow.iteye.com/blog/1565926

      虽然,多年java,正在java,看样子还得继续java.(IT小城,还是整java随意点)应用程序 运行于操作系统之上,  晓操作系统,方更晓应用程序. 主看windows,因为可玩性高,闭源才 ...

  9. POJ 矩阵相乘 (随机化算法-舍伍德(Sherwood))

    周三的算法课,主要讲了随机化算法,介绍了拉斯维加斯算法,简单的理解了为什么要用随机化算法,随机化算法有什么好处. 在处理8皇后问题的时候,穷举法是最费时的,回朔比穷举好点,而当数据量比较大的时候,如1 ...

  10. ZeroMQ(java)之Router与Dealer运行原理

    在开始这部分的内容之前,先来看看ZeroMQ中HWM概念---High-Water Marks 当系统的数据量很大,而且发送频率很高的情况下,内存就很重要了,如果处理不好会出现很多问题,例如如下场景: ...