----------------------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培训、期待与您交流! ----------------------