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

 ----------------------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访问级别的具有getset或其中一个方法的变量,这个变量用于保护一个私有变量(保护对应字段读取或者赋值符合要求);一般命名时与被保护变量关联,用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)对于每一个私有变量来说,可以通过如下操作调出对应的属性设置:

属性中的getset被称为访问器的特殊方法,get用于返回值,用return或者throw语句中止(简单属性除外),控制权不能离开访问器体。set用于设置或分配值;value是关键字,用于代表设置或分配的值。

也可以通过快捷键ctrl+R+E调出私有字段属性。

简单属性是指对赋值无要求或者待添加时简写的属性框架,如下例:

       int score;

       public int Score

       {

           get;

           set;

       }

这种简写仅限于.net3.0版本以后。        

 2属性分类:

 读写属性  同时具有getset方法的属性。

 只写属性  只有set方法的属性,只能写入不能读取。(用的少)

 只读属性  只有get方法的属性,只能读取不能写入。

3)属性与字段区别:

1)字段一般不声明为public访问级,命名遵照camel命名法。而属性一般声明为public访问级(私有属性除外),名字与其保护字段相同(首字母大写除外),命名遵照pascal命名法。

2)属性包含setget或两者同时存在的访问器,而字段没有。

3)属性不能作为变量来分类,不能将属性作为refout参数传递。

4.初始化和构造方法

  当我们实例化一个类的时候,系统会自动对这个类的属性进行初始化。数字类型初始化为0/0.0string类型初始化为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培训、期待与您交流! ---------------------- 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值