您的位置:首页 > 职场人生

黑马程序员————————C#基础知识之面向对象(一)

2013-10-05 14:40 337 查看
 ----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流!
---------------------- 
l       类和类的实例(对象)
l       访问修饰符
l       属性
l     初始化和构造方法
l    通用类图和析构函数
1. 类
 对象的属性和方法的集合,而对象,又叫做类的实例,类不占内存,对象占内存;类的成员可以是属性,方法等,在定义之初就需要指定访问级别。
1)基本语法:
    
     {访问修饰符}
class 类名
      {
          成员;
           ...
         
      }
2)类的实例化(产生对象)

语法

类 实例名=new类();
3)类成员的访问(非静态成员)
  语法:  实例名.成员名
  实例名.属性          实例名.方法名();
4)类的继承:
   在声明一个类时,在其后加上冒号,再在其后加上基类名(想要继承的类),新类(又叫做派生类)将获取所有基类的非私有数据(字段,变量,方法,属性),并且拥有自己类中的定义的数据。
如下是基类和派生类声明的对象比较:







可以看出,派生类class
Firperson :Person继承了基类class
Person的非私有数据,包括字段,属性,方法,而基类声明的对象,即使出现在子类中,也只拥有其自有数据。
*加static的方法或变量可以直接用类名.方法名调用,不加的需要先对类进行实例化,然后用实例名.方法名/变量调用。
2.访问修饰符
 public  可以在任意地方被访问
 Internal  
只能在本项目中被访问
 protected 
只能在本类和子类中被访问
 private  
只能在本类中被访问
    在命名空间内与类同一级别的变量方法等默认(就是不写)访问级别为internal,在类里边与方法同一级别的变量方法等默认访问级别问private,枚举中的默认访问级别为public,结构中的默认访问级别为private,接口中的默认访问级别为public。
一般情况下,禁止将字段的访问级别写成public。
3.属性
 字段 定义在类中的变量。
 属性  允许外部访问的变量要声明为属性。
概念:定义一个public访问级别的具有get,set或其中一个方法的变量,这个变量用于保护一个私有变量(保护对应字段读取或者赋值符合要求);一般命名时与被保护变量关联,用pascal命名法命名。属性中并不存储数据,数据存储在其保护的私有变量(字段)中。
例如:string
name;
       public
string Name                     //
属性,用于保护对应的name的合法性(防止乱输入)
       {
           get {
return name; }
           set { name =
value; }
       }
       char sex;
       public
char Sex
       {
           get {
return sex; }
           set
           {
               if (value =='女'
||value == '男')           //设置要求引用或使用时只能是男女
               {
                   sex =
value;
               }
               else
               {
                   sex =
'男';                        //即使用户输入错误,也会保留默认值
               }
           }
       }
       int age;
       public
int Age
       {
           get {
return age; }
           set { age =
value; }
       }
1)对于每一个私有变量来说,可以通过如下操作调出对应的属性设置:



属性中的get和set被称为访问器的特殊方法,get用于返回值,用return或者throw语句中止(简单属性除外),控制权不能离开访问器体。set用于设置或分配值;value是关键字,用于代表设置或分配的值。
也可以通过快捷键ctrl+R+E调出私有字段属性。
简单属性是指对赋值无要求或者待添加时简写的属性框架,如下例:
       int
score;
       public
int Score
       {
           get;
           set;
       }
这种简写仅限于.net3.0版本以后。        
 2属性分类:
 读写属性  同时具有get和set方法的属性。
 只写属性  只有set方法的属性,只能写入不能读取。(用的少)
 只读属性  只有get方法的属性,只能读取不能写入。
3)属性与字段区别:
1)字段一般不声明为public访问级,命名遵照camel命名法。而属性一般声明为public访问级(私有属性除外),名字与其保护字段相同(首字母大写除外),命名遵照pascal命名法。
2)属性包含set或get或两者同时存在的访问器,而字段没有。
3)属性不能作为变量来分类,不能将属性作为ref或out参数传递。
4.初始化和构造方法
  当我们实例化一个类的时候,系统会自动对这个类的属性进行初始化。数字类型初始化为0/0.0;string类型初始化为null.
Char类型初始化为\0.
  类在实例化产生对象时,会执行一个与类名相同的默认方法,用于初始化对象的数据;这个方法如果没有参数则成为默认构造方法。自定义构造方法时,默认构造方法会被替代,构造方法可以不写void,添加参数用于初始化对象数据,无参时取默认值。
默认的构造函数是通过new来调用的,new相当于对构造函数进行初始化,在c#中不允许使用未初始化的变量,String类可以不用new初始化。
下表是由默认构造函数返回的默认值。(引用自MSDN)
bool
false
byte
0
char
'\0'
decimal
0.0M
double
0.0D
enum
表达式 (E)0 产生的值,其中 E 为 enum 标识符。
float
0.0F
int
0
long
0L
sbyte
0
short
0
struct
将所有的值类型字段设置为默认值并将所有的引用类型字段设置为 null 时产生的值。
uint
0
ulong
0
ushort
0
用构造函数来初始化例如:
    classText
   {
       public Text()      
//一般即使是默认构造函数也写成显式,便于维护
       {
           a = 10;
       }
       int a;
       public
int A
       {
           get {
return a; }
       }
       bool s;
       public
bool S
       {
           get;
           set;
       }
       public
void Say()
       {
           Console.WriteLine("初始化值:{0}\t{1}",
a, s);
       }
       static
void Main(string[] args)
       {
           Text s =
newText();
           s.Say();
           Console.ReadKey();
       }
}
输出:


5.使用构造方法的好处:
1)对多个属性进行赋值时,不需要重复的写实例名。
2)可以保证用户在new一个对象时必须对某一个属性赋值。
3)用于只读对象创建时初始化数据。
关于属性和构造方法之间相辅相成的关系,如下例:
 classStudents
   {
       public Students(string name,char
sex, int age,int chinese,
int math,int english)  //与类名相同的方法
       {
           this.name = name;               //
this.name 表示字段(变量),单写name表示参数
           this.sex = sex;
           this.age = age;
           this.chineseScore = chinese;
           this.mathScore = math;
           this.englishScore = english;
       }
       public Students(string name,char
sex)    //可重载
       {
           this.name = name;
           this.sex = sex;
           this.age = 18;
           this.englishScore = 0;
           this.chineseScore = 0;
           this.mathScore = 0;
       }                       //此时默认的无参构造方法已经消失,不想传参需要自己再添加方法
       string name;
       public
string Name
       {
           get {
return name; }     //只读属性,数据在传参的时候初始化,之后便不可更改        
       }
       char sex;
 
       public
char Sex
       {
           get {
return sex; }
           set
           {
               if (value =='女'
||value == '男')
               {
                   sex =
value;         //输入非男、女字符都会出错,sex取默认值男
               }
               else
               {
                   sex =
'男';          //保留默认值
               }
           }
       }
       int age;
       public
int Age
       {
           get {
return age; }
           set { age =
value; }          //一个完整的可读写属性
       }
       int chineseScore;
       public
int ChineseScore
       {
           get {
return chineseScore; }
           set
           {
               if (value >= 0 &&value
<= 100)
               {
                   chineseScore =
value;         //限定属性
               }
               else
               {
                   chineseScore = 0;
               }
           }
       }
       int mathScore;
       public
int MathScore
       {
           get {
return mathScore; }
           set
           {
               if (value >= 0 &&value
<= 100)
               {
                   mathScore =
value;
               }
               else
               {
                   mathScore = 0;
               }
           }
       }
       int englishScore;
 
       public
int EnglishScore
       {
           get {
return englishScore; }
           set
           {
               if (value >= 0 &&value
<= 100)
               {
                   englishScore =
value;
               }
               else
               {
                   englishScore = 0;
               }
           }
       }
       string s;
       public
void SayHello()   两个方法,可以看做对象的行为
       {
           Console.WriteLine("我叫{0},今年{1}岁,我是{2}生。",
name, age, sex);
       }
       public
void GetScore()
       {
           int sum = chineseScore + mathScore + englishScore;
           Console.WriteLine("我叫{0},这次考试总成绩为{1},平均成绩为{2}",
name, sum, sum / 3);
       }
}
This用于引用当前实例
可以看出,如上众多属性,方法,构造方法,都是为了实例化一个类,产生一个对象,他们之间互相关联,相辅相成,从而让我们可以简单的产生一个对象。在visual
studio 中,String同样是一个类,但是它在调用时却不需要做显式初始化操作(new)?
要实例化一个类,必须调用构造方法。
6.通用类图:



-表示private  +
表示public

7.析构函数
   与构造函数相对应,为最后调用的方法,当对象从内存消失时,析构函数用来释放内存资源。
析构函数特点:
l      一个类只能有一个析构函数。
l      不能在结构中定义析构函数。
l      无法继承或重载析构函数。
l      无法主动调用析构函数,它是被自动调用的。
l      析构函数既没有修饰符也没有参数。
如下:
       ~Student1()        // 
~ 加与类名字相同的方法名
       {

       }
 
----------------------
ASP.Net+Android+IOS开发.Net培训、期待与您交流! ---------------------- 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息