一、构造函数 核心概念(必背定义)
1. 构造函数特点
-
方法名必须和类名完全一致
-
没有返回值(连void都不写)
-
在 new 创建对象的瞬间自动执行
-
核心作用:创建对象、初始化成员数据(属性/字段)
2. 默认构造函数规则
-
如果类中不写任何构造函数,编译器会自动赠送一个【空的无参构造函数】
-
一旦自己手写了【有参构造函数】,系统不再赠送默认无参构造
二、两种构造函数 代码精讲
1. 无参构造函数(自定义初始化)
// 无参构造函数
public People()
{
Name = "张三";
this.Age = 10;
}
执行场景
People p1 = new People();
Console.WriteLine(p1.Name); // 张三
People p2 = new People();
Console.WriteLine(p2.Name); // 张三
每次 new 无参构造对象,默认初始化 Name=张三,Age=10
2. 有参构造函数(自定义赋值)
public People(string n, int a)
{
this.Name = n;
this.Age = a;
Console.WriteLine(this.Name + "---------");
}
执行场景
People p3 = new People("李四",20);
Console.WriteLine( p3.Name); // 李四
People p4 = new People("王五", 20);
Console.WriteLine(p4.Name); // 王五
作用:创建对象的同时,直接给属性赋值,不用额外写代码赋值。
三、this 关键字 必考知识点
1. this 含义
this 代表当前类的当前实例对象
不是特指某一个对象,谁调用就指代谁。
2. this 两大作用
-
区分:局部变量 和 成员属性 重名问题
-
this.属性表示给当前对象的属性赋值
示例解析:
this.Name = n;
// this.Name → 当前对象的属性
// n → 方法传入的参数
四、构造函数重载(必考)
1. 重载条件
同一个类中,方法名相同、参数列表不同(个数/类型/顺序)
2. 本题重载
-
People()无参构造 -
People(string n, int a)有参构造
优点:创建对象灵活,想用默认值就无参、想自定义值就有参。
五、程序完整运行结果
张三
张三
李四---------
李四
王五---------
王五
六、超级易错考点(考试坑点)
-
构造函数无返回值、名和类名一致
-
手写有参构造后,默认无参构造会消失,需要手动写出来
-
构造函数只会在 new 对象时自动执行一次
-
this 用来区分参数和属性重名冲突
-
构造函数核心作用:初始化对象数据
七、简答题满分标准答案
1. 构造函数的作用?
构造函数在实例化对象时自动调用,主要用于创建对象并初始化对象的属性和字段数据。
2. this关键字的作用?
this关键字指代当前类的实例对象,用于区分成员属性和局部变量重名的问题,访问当前对象的成员。
3. 构造函数重载的好处?
提供多种对象初始化方式,既可以使用默认数据创建对象,也可以自定义数据创建对象,提高代码灵活性。
------------析构函数(终结器)|GC 垃圾回收------------------
一、析构函数 核心定义(必背)
析构函数(终结器):在对象被 GC 垃圾回收销毁时,系统自动调用的方法,用于释放资源、清理内存。
语法特征(硬性规则)
-
方法名:~类名()
-
没有返回值、没有参数、不能重载、不能手动调用
-
只能由 GC垃圾回收器自动触发
二、你提供的代码逐行精讲
1. 析构函数定义
~People()
{
Console.WriteLine("对象被GC回收了");
}
触发时机:当前对象没有任何引用、被GC回收的一瞬间执行
2. Main 方法执行流程
People p = new People(); // 1.创建对象
p = null; // 2.切断所有引用,对象变成垃圾
GC.Collect(); // 3.强制触发GC垃圾回收
Console.ReadKey(); // 4.等待查看结果
三、代码执行原理(必考)
-
创建对象:new People() 在堆内存开辟空间
-
断开引用:p = null; 变量不再指向堆中的对象,对象变为【无引用垃圾对象】
-
强制回收:GC.Collect() 手动触发垃圾回收机制
-
自动执行析构函数:对象销毁前,系统自动调用 ~People()
四、GC 垃圾回收核心知识点
1. GC 回收规则
堆内存中 没有任何变量引用的对象,被视为垃圾,等待GC回收。
2. GC.Collect()
作用:强制手动触发垃圾回收
正常情况下GC是系统自动不定时回收,我们可以手动调用强制回收。
五、构造函数 VS 析构函数(终极对比)
| 对比项 | 构造函数 | 析构函数 |
|---|---|---|
| 语法 | 与类名同名 | ~类名() |
| 参数 | 可以有参数、支持重载 | 无参数、不支持重载 |
| 执行时机 | new 对象时执行(初始化) | 对象销毁回收时执行(清理) |
| 作用 | 创建对象、初始化数据 | 释放资源、收尾清理 |
| 控制权 | 程序员可控 | GC系统自动执行 |
六、高频易错坑点
-
析构函数不能手动调用,只能GC自动调用
-
对象必须 无任何引用 才会被回收(p=null 关键)
-
不写 GC.Collect() 也会回收,只是时机不确定
-
析构函数 无参、无返回值、不能重载
七、极简背诵口诀
构造建新初始化,析构销毁清资源;
构造可参可重载,析构无参不能改;
构造手动new触发,析构GC自动唤。
------------三种构造函数 + 析构函数 终极对比------------------
一、四大函数总分类(面向对象核心四巨头)
-
实例无参构造函数:初始化普通对象、默认赋值
-
实例有参构造函数:自定义对象初始化数据
-
静态构造函数:初始化静态成员、只执行一次
-
析构函数:对象销毁、资源释放
二、终极超级对比表(考试直接默写)
| 函数类型 | 语法特征 | 修饰符 | 参数 | 执行时机 | 执行次数 | 核心作用 |
|---|---|---|---|---|---|---|
| 无参实例构造 | 与类名同名 | public | 无参数 | 每次 new 对象执行 | new几次执行几次 | 给对象默认初始化 |
| 有参实例构造 | 与类名同名 | public | 有参数 | 每次 new 对象执行 | new几次执行几次 | 自定义对象初始化数据 |
| 静态构造函数 | static + 类名同名 | 只能static、不能加访问修饰符 | 无参数 | 类第一次被使用/第一次new时触发 | 全局终身只执行一次 | 初始化静态字段、静态数据 |
| 析构函数 | ~类名() | 无修饰符 | 无参数 | GC回收对象时 | 每个对象销毁执行一次 | 释放资源、清理内存 |
三、核心考点逐条拆解(必考)
1. 实例构造函数(无参/有参)
-
属于对象,每 new 一个对象,独立执行一次
-
可以函数重载(多个构造函数共存)
-
作用:初始化 非静态属性、字段
-
一旦手写有参构造,系统自动默认无参构造消失
2. 静态构造函数(超级重点)
-
属于类,不属于对象
-
禁止访问修饰符(不能写public/private)
-
绝对无参数,不能重载
-
无论 new 多少个对象,全程只执行唯一一次
-
优先于实例构造函数执行
-
专门用来初始化 静态成员
3. 析构函数
-
由 GC垃圾回收器自动调用,程序员无法控制时机
-
无参、无返回值、不能重载、不能手动调用
-
对象被置为 null、无引用后才会被回收触发
-
作用:关闭文件、释放数据库连接、释放资源
四、执行顺序终极标准答案(默写)
静态构造函数 → 实例构造函数 → 对象使用 → 析构函数
五、高频易错判断题(必背坑点)
-
静态构造函数可以写多个?❌ 不能重载、只能一个
-
静态构造函数可以加public?❌ 绝对不可以
-
实例构造函数执行多次,静态构造只执行一次 ✅
-
析构函数由程序员调用?❌ GC自动调用
-
构造函数负责初始化,析构函数负责销毁 ✅
-
静态构造函数先执行,实例构造后执行 ✅
六、简答题满分模板
1. 静态构造函数和实例构造函数的区别?
实例构造函数属于对象,每次new对象都会执行,用于初始化实例成员,支持重载;静态构造函数属于类,全局仅执行一次,无法重载、不能加访问修饰符,用于初始化静态成员,优先于实例构造函数执行。
2. 构造函数与析构函数的区别?
构造函数在创建对象时执行,用于初始化对象数据,可带参数、可重载;析构函数在对象被GC回收时自动执行,用于释放资源,无参数、不可重载,由系统自动调用。
七、终极口诀(考前速记)
实例构造建新对象,每new一次跑一遍;
静态构造归类所有,全局一生只跑一遍;
析构函数收尾清场,GC回收自动相见。