静态类,密封类

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.静态方法在第一次调用时加载

posted @ 2012-07-04 20:30  zxp19880910  阅读(375)  评论(0编辑  收藏  举报