第5章-类和对象 - 2
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10
2 析构函数
用于执行清除操作的特殊方法。 1. 析构函数不能有参数,一个类中只能有一个析构函数。 2. 析构函数用户销毁内存中已创建的对象。 3. 析构函数的名字与包含它的类的名字同名,前面加~,并且 不定义返回值类型,即使void也不可以。 4. 类中可以不写析构函数,编译器会自动创建,并在释放对象 时自动调用。
15
示例:
class MyClass { 用户自定义类访问规则: public int a; 1.静态方法只能访问静态成员变量 static public int b; void Fun1() //定义一个非静态方法 2.非静态方法即可访问静态成员变量又可访问非静态成员变量 { 3.静态方法或静态成员变量通过类名访问 a = 10; //正确,直接访问非静态方法 4.非静态方法或非静态成员变量通过实例名称来访问 b = 20; //正确,直接访问静态方法 } public static //定义一个静态方法 static void Fun2() void Main() { { a = 10; MyClass clsA = new MyClass(); //错误,不能访问非静态方法 b = 20; clsA.a = 10; //正确 //正确,可以访问静态成员 clsA.b = 20; //错误 } MyClass.a = 30; //错误 } MyClass.b = 40;//正确 }
18
解决方案
public class Student public void GetStudent() { { 输入输出信息 int Console.WriteLine(stuId); stuId; 较为复杂,如 string stuName; Console.WriteLine(stuName); 何简化? int stuAge; Console.WriteLine(stuAge); static int stuNum = 0; } public Student(int stuId,string stuName,int stuAge) public static void Main() public static void GetNumber() { { this.stuId = stuId; { Student s1,s2; this.stuName = stuName; Console.WriteLine(stuNum); s1 = new Student(100, "mary", 21); this.stuAge = stuAge; } Student.setNumber(); } } s1.GetStudent(); public static void setNumber() Student.GetNumber(); { s2 stuNum++;= new Student(101, "tom", 22); Student.setNumber(); } s2.GetStudent(); Student.GetNumber(); 19 }
构造函数修饰符一般为 public 参数列表个数与成员变量 个数相同,且一一对应
示例: public Student(string StuNo,string StuName,string StuSex) { //构造函数体 } 5
4.3.1 构造函数
构造函数体:
this.成员变量名 = 成员变量名; 示例: public Student(string StuNo,string StuName,string StuSex) { this.StuNo = StuNo; this.StuName = StuName; this.StuSex = StuSex; }
回顾
访问修饰符 类的声明 类的实例化
1
习题:
Student类中包含成员变量StuNo(学号),StuName(学生姓 名),StuSex(学生性别)及成员函数SetInfomation()(设置学 生基本信息),GetInformation()(获取学生基本信息)。最后在 Main()函数中创建Student类对象Tom,并访问成员变量及成员 函数。
}
12
练习:
public class Time 有Time类如下: { Time t1, t2, t3, t4 ; t1= newint hour, minute, second; Time (); t2 = newpublic Time ( ) Time(8); { this.hour=this.minute=this.second=0; } t3 = new Time(8, 30); t4 = newpublic Time (int hour) Time(8,30,30);类中还有ShowTime方法用来显示当 { this.hour=hour; this.minute=this.second=0; } 前时间为×小时Y分Z秒,请根据要求实现Time类。 public Time (int hour, int minute) { this.hour=hour; this.minute=minute; this.second=0;} public Time (int hour, int minute, int second) {this.hour=hour;this.minute=minute; this.second=second;} public void ShowTime() { Console.WriteLine(“当前时间为{0}时{1}分{2} 秒”,hour,minute,second); } 13 }
14
静态成员的应用
对于学生类示例,想要得到所有学生人数的信息,该如何获取呢?很显然, 这不是某个具体学生张三、李四的属性,而是整个学生群体的属性,对于 这种情况,可以说这种属性是类的属性,而非其对象的属性。 在面向对象中,类的属性称之为静态属性。 C#中使用static关键字来定义静态属性或方法,静态属性不能用实例化 对象引用,只能用类引用。若属性是静态的,通过“类名.属性”访问; 若属性是非静态的,则是通过“对象名.属性”访问。 思考: 解决方案: 项目中什么时候会用到静态成员? 网站中的当前在线人数,访问次数等; 访问数据库的方法;
示例: ~Student() {}
11
思考:
同一个类中,如果函数同名,参数列表不同,则称 为函数的重载。一个类中不同的构造函数组成,称 为构造函数重载!
解决方案: 假设学生的学号,姓名已知,由于学生尚未报道,对于学生的 public Student(){}//默认构造函数 性别未知,现希望当性别未知时,性别取默认值“M”,性别已 public Student(string StuNo,string StuName) 知,则通过构造函数赋值给相应的对象。构造函数如何写? { this.StuNo = StuNo; this.StuName = StuName; this.StuSex = “M”; } public Student(string StuNo,string StuName, string StuSex) { public static void Main() this.StuNo = StuNo; { this.StuName = StuName; Student Tom = new Student(“A001”,“Tom”,”M”); this.StuSex = StuSex; Student Jane = new Student(“A002”,”Jane”); }
8wk.baidu.com
注意:C#中提供了默认的不带参数的 构造函数,如果用户不写该函数,则编 译器为用户默默的创建!一个类中可以 public class Student 有多个构造函数! { public Student() private string StuNo; {}
思考:
private string StuName; private string StuSex; public void InputInfo() { … } public void ShowInfo() { … public static void Main() { }
改进后的Student类
public void ShowInfo() { Console.WriteLine(this.StuNo); Console.WriteLine(this.StuName); Console.WriteLine(this.StuSex); } 显示当前对象对应的成员变量,这里this也可省略不写!但构造函数 中的this不可省略,否则编译器报错!
16
思考:
Main函数为什么是static?
在程序刚开始运行的时候,Main函数是程序的入口,此时 未建立任何实例,因此无法调用实例成员,为了能够在程序的 开始执行Main方法,必须将其声明为静态。要是main也要实例 化的话,那谁又来实例化main呢?
17
示例
设计学生类,其中包含学号,姓名,年龄及学生总人数共4个属性,方 法有Student()(构造函数),setNumber(),getStudent(), getNumber()。 (1)以上属性和方法中哪些是非静态数据,哪些是静态数据? (2)设计程序实现该类。
4.1.3静态成员和非静态成员
类中的成员要么是静态,要么是非静态的。 将类中的某个成员声明为static,该成员称为静态成员。 类的非静态成员属于类的实例所有 每创建一个类的实例,都在内存中为非静态成员开辟了 一块存储区域; 用实例访问,形式:实例名.非静态成员 而类的静态成员属于类所有 无论这个类创建了多少个实例,一个静态成员在内存中 只占有一块区域,为这个类的所有实例所共享。 用类访问,形式:类名.静态成员 类的静态方法只能直接访问类的静态成员!
2
第5章
类和对象-2
目标
类的构造函数 构造函数的重载
静态成员和非静态成员
4
1 构造函数
构造函数是一种特殊的成员函数。 1.当创建一个类的实例的时候构造函数会自动被编译器调用。 2.构造函数被用于初始化类的成员变量。 3.构造函数的名字与包含它的类的名字同名,并且不定义返回值类 型,即使void也不可以。 语法: [访问修饰符] <类名>([参数列表]) { //构造函数体,初始化工作 }
}
Student Tom = new Student(); Tom.InputInfo(); Tom.ShowInfo();
9
}
习题:
仿照Student类创建Teacher类, Teacher类中包含成员 变量teaNo(工号),teaName(教师姓名),teaAge(年龄), teaTitle(职称)及构造函数和GetInformation()(获取 教师基本信息)。最后在Main()函数中创建Teacher类对 象Jane,并访问成员变量及成员函数。
6
改进后的Student类
public class Student { this指向当前的对象 private string StuNo; private string StuName; private string StuSex; public Student(string StuNo,string StuName, string StuSex) { this.StuNo = StuNo; this.StuName = StuName; this.StuSex = StuSex; } publicpublic void ShowInfo() static void Main() { { Console.WriteLine(StuNo); Student Tom = new Student(“A001”,”Tom”,”M”); Console.WriteLine(StuName); Tom.ShowInfo(); Console.WriteLine(StuSex); } } 7 }