2012-05-19面向对象三(静态类,密封类)
1.继承:目的--->
a) 复用: 子类继承父类所有成员,但是只能访问非私有的成员.
b) 多态: LSP--父类 obj=new 子类(); 如果子类和父类里存在相同方法:
i. 参数列表不相同: 构成子类中的方法重载,也就是子类包含两个同名方法(参数列表不同)
ii. 参数列表相同:
1. 如果同名方法不存在重写关系(子类没有重写父类方法):
a) 父类 obj=new 子类(); obj.SayHi(); //执行父类的SayHi();
b) 子类 obj=new 子类(); obj.SayHi(); //执行子类的SayHi(); (此时,子类对象中隐式隐藏了父类的SayHi方法,也可以通过new 来显式隐藏)
2.如果子类重写父类的方法.(父类的方法必须是虚方法/抽象方法,子类通过override关键字 重写)
c) 父类 obj=new 子类(); obj.SayHi(); //执行子类的SayHi();
d) 子类 obj=new 子类(); obj.SayHi(); //执行子类的SayHi();
3.多态的常用方式:
a) 简单工厂,以返回值的方式来使用, 举例: 父类 obj=FactoryMethod("a"); //工厂方法中, 通过判断 参数来创建相应的子类对象,并返回父类对象使用. 好处:父类不需要关心具体的实现(new) , 只要针对父类中能够访问到的成员来编写下面代码就可以了.
b) 父类做参数 方式:
c) Public void Test( 父类 o){ o.SayHi();} 子类A obj=new 子类A(); Test(obj); //此方法中不关心 传进来的对象具体方法的实现代码,只关心能调用什么方法.
3.多态:(同上)
4.类与成员的修饰符"
类
public、internal、abstract、sealed、static
成员(方法)
public、private、protected、internal
protected internal
abstract、virtual、new、override
static
extern(****)// 表示方法可以定义在内部实现在外部
------------------------------------2.19-------------------
1.类型转换:
a) 隐式类型转换(数值类型之间)
b) 强制类型转换
c) 不能强制将 数值类型 转换为 字符转类型 (ToString(), Convert.ToInt32();)
d) 类型转换 Convert 加工, 改造 的过程
2.静态成员
使用静态变量 条件: 整个程序内部 共享的数据.
使用静态方法 条件: 当方法在整个程序中处于工具方法的地位时
举例: 当我们登陆QQ后,就应该把QQ号以静态变量的方式存起来.
这样 当用户访问微博方法和QQ空间方法时,就可以直接从静态变量中 获取Q号了,不需要每次都要求用户输入QQ号
静态类 中的成员 必须都是 静态的.
3.普通类中的静态成员:
a) 只能通过类名访问(类名.静态成员)
b) 静态方法中只能访问静态成员,不能访问实例成员,(如果访问,必须实例化对象后,用对象名.成员名 访问)
c) 多个对象共享一个静态成员
4.静态类:(单一实现)
a) 静态构造函数(1.不能有访问修饰符,2.只有一个无参数的 3.声明使用static 举例: static Class1(){}):
b) 静态构造函数的作用是:用来初始化 静态类中的静态数据成员, 静态构造函数 只会在静态类第一次被访问时 执行一次.
c) 静态构造函数被系统自动调用: 1.在类的任何实例被创建之前. 2.在类的任何静态成员被引用之前.
d) 静态方法和静态变量 创建后始终使用同一块内存(静态存储区),而使用实例的方式会创建多个内存.
e) 静态类不能 被继承, 只能继承Object类
f) 静态类不能实现任何接口,(实现接口 就要实现接口中的实例方法,静态类中只能实现 静态成员)
4.密封类(sealed): 不能够被继承.----举例:string类
5.静态类的本质:abstract + sealed,不能被实例化,不能被继承
6.类与成员的修饰符:
a) 类: public internal,abstract,sealed,static
b) 成员:
7.结构体存在的意义: (允许用户定义一个自定义的值类型)
8.结构,在使用new关键字创建对象后,所有的成员变量都已经存在,并有默认值(值类型),如果没有用new关键字,则需要程序员手动为所有成员变量赋值后,再使用
a) 结构是值类型,类是引用类型
b) 在结构声明中,除非字段被声明为const或static
9.什么时候定义值类型(结构), 什么时候定义引用类型(类).
a) 值类型:主要是用来封装 一组数据 并为数据提供一些简单的处理方式.
b) 引用类型:
i. 只要用来封装 数据 和 行为.
ii. 使用面向对象的特性: 封装 继承 多态
iii. 结构适用于小的数据结构,当成员较多时,建议使用类,
9. 在结构中 不能为变量直接赋初值,除非const,ststic.
10. 结构的使用方法与类相似.什么时候使用类,什么时候使用结构?
1.是否需要使用面向对象的特性:封装、继承、多态。,如果需要在某些情况下被继承或者使用多态等特性则只能用类. 当类型中(类或结构)的成员比较多的时候,则考虑使用类。
了解:
结构是使用 struct 关键字定义的,例如:
C#
public struct PostalAddress { // Fields, properties, methods and events go here... }
结构与类共享大多数相同的语法,但结构比类受到的限制更多:
在结构声明中,除非字段被声明为 const 或 static,否则无法初始化。
结构不能声明默认构造函数(没有参数的构造函数)或析构函数。
结构可以声明带参数的构造函数。
结构不能从类或其他结构继承。
结构在赋值时进行复制。将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据。
结构是值类型,而类是引用类型。
与类不同,结构的实例化可以不使用 new 运算符。
一个结构不能从另一个结构或类继承,而且不能作为一个类的基类。所有结构都直接继承自 System.ValueType,后者继承自 System.Object。
结构可以实现接口。
===============================================================
类和结构是 .NET Framework 中的通用类型系统的两种基本构造。两者在本质上都属于数据结构,封装着一组整体作为一个逻辑单位的数据和行为。数据和行为是该类或结构的“成员”,它们包含各自的方法、属性和事件等(本主题后面列出了这些内容)。
类或结构的声明类似于蓝图,用于在运行时创建实例或对象。如果定义一个名为 Person 的类或结构,则 Person 为类型名称。如果声明并初始化 Person 类型的变量 p,则 p 称为 Person 的对象或实例。可以创建同一 Person 类型的多个实例,每个实例在其属性和字段中具有不同的值。
类是一种引用类型。创建类的对象时,对象赋值到的变量只保存对该内存的引用。将对象引用赋给新变量时,新变量引用的是原始对象。通过一个变量做出的更改将反映在另一个变量中,因为两者引用同一数据。
结构是一种值类型。创建结构时,结构赋值到的变量保存该结构的实际数据。将结构赋给新变量时,将复制该结构。因此,新变量和原始变量包含同一数据的两个不同的副本。对一个副本的更改不影响另一个副本。
类通常用于对较为复杂的行为建模,或对要在创建类对象后进行修改的数据建模。结构最适合一些小型数据结构,这些数据结构包含的数据以创建结构后不修改的数据为主。
11.访问级别约束:
子类的访问级别不能比父类的高
方法参数的访问级别必须>=方法的访问级别
12.析构函数: ~+类名(){} (析构函数 执行在 类的实例被销毁之前 需要清理或 释放非托管资源的行为)
a) 每个类只有一个析构函数,析构函数不能带任何参数.也不能带访问修饰符
b) 析构函数只对类的实例起作用,因此没有静态析构函数
c) GC 垃圾回收器,会每隔一段时间,检查托管堆里是否有 没被引用的对象.如果有 则销毁,释放对象占有的内存呢空间,以供新对象使用.
d) 不能在结构中定义 析构函数. 只能对类使用析构函数(结构是值类型,在栈中分配空间,使用完立即销毁, 而析构函数是 垃圾回收器收集过程中, 调用析构函数,回收释放 那些没被引用的对象.)
值类型与引用类型
值类型: 均隐式派生自System.ValueType
数值类型、bool、结构、枚举
查看IL,隐式继承自ValueType
引用类型: 派生自System.Object
字符串、数组、类、接口等
查看IL隐式继承自Object
引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。
-----------------------熟悉类库-----------------------------
常用类库--
StringBuilder高效的字符串操作
当大量进行字符串操作的时候,比如,很多次的字符串的拼接操作。
String 对象是不可变的。 每次使用 System. String 类中的一个方法时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。 在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常大。 如果要修改字符串而不创建新的对象,则可以使用 System.Text. StringBuilder 类。 例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。
StringBuilder != String//将StringBuilder转换为String.用ToString();
StringBuilder仅仅是拼接字符串的工具,大多数情况下还需要把StringBuilder转换为String.
StringBuilder sb = new StringBuilder();
sb.Append();
sb.ToString();
sb.Insert();
sb.Replace();
1.字符串:--恒定性(不可变性) 可以看成一个字符数组
a) 属性:Length;
b) 方法:
i. IsNullOrEmpty() String类的静态方法,同时判断字符串的两种空状态
ii. ToCharArray() 将string转换为char[]
iii. ToLower() 小写,必须接收返回值
iv. ToEquals() 转大写, "=="的区别?? ---> ==比较时, 1. 如果比较的是值类型,则比较两个对象的值. 2.如果比较的是引用类型,则比较两个对象的引用是否相同(堆地址是否相同), Equals(): 1.此方法是Object内的一个虚方法,默认用 == 进行比较 2.但是大部分微软的类,及用户自定义的类,都重写了该 虚方法,也就是微软和用户各自为自己编写的Object的子类,定义了相等比较的规则
v. IndexOf(); 用来查找某个字符或字符串,在一个特定字符串对象里的下标. 如果没找到数据则返回-1;
vi. Substring(); 截取字符串
vii. Split(); 分割字符串.
viii. Join() : 静态方法. String . Join()
ix. Format();
x. Replace(); 可以链式编程 .replace().replace();
xi. Trim(); 去掉 首, 尾 空格符(两边)
字符串的恒定性: 当字符串在内存中已经被创建后,程序员再次创建想通知的字符串对象时,CLR做了优化,直接把第一个字符串的引用付给了第二个变量. 也就是说,前后两个字符串变量保存了相同的字符串对象应用.
注意:
1.如果代码里是直接将链各个字符串相加,那么在CLR编译IL的时候,就会直接将相加拼接后的新字符串作为变量的值.
2.但 如果代码里是将两个字符串变量相加的话,那么CLR会再编译IL时,调用string.Concat(string,string) 方法来拼接两个字符串变量的值, 最终返回一个新的字符串变量
StringBuilder类:
1.高效的字符串操作:
枚举:
有时为了固定一个变量的"范围",也方便程序员的使用.
枚举项中只能用整型类型. 可以讲枚举项 强转成 对应的整型值
一个类第一次被访问时的顺序:
1.静态成员加载(如果是静态字段,则在赋初值后会先加载)-->静态构造函数-->创建类的对象-->调用累的非静态构造函数
一个类第n次被访问的顺序:
创建类的对象--->调用类的非静态构造函数
3.静态方法在第一次调用时加载