C# 构造函数(无参/有参/重载/this)+析构函数(终结器)|GC 垃圾回收

一、构造函数 核心概念(必背定义)

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.等待查看结果

三、代码执行原理(必考)

  1. 创建对象:new People() 在堆内存开辟空间

  2. 断开引用:p = null; 变量不再指向堆中的对象,对象变为【无引用垃圾对象】

  3. 强制回收:GC.Collect() 手动触发垃圾回收机制

  4. 自动执行析构函数:对象销毁前,系统自动调用 ~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回收自动相见。

相关推荐
武子康1 小时前
Java-12 深入浅出 MyBatis 二级缓存详解:跨 SqlSession 共享与失效机制
java·后端
考虑考虑1 小时前
JDK9中的Set.of()使用注意
java·后端·java ee
plainGeekDev1 小时前
findViewById → ViewBinding
java·kotlin·gradle
kkeeper~1 小时前
0基础C语言积跬步之自定义类型结构体
c语言·开发语言
yz_aiks1 小时前
IDEA终端配置oh-my-zsh实战:安装、插件与日常使用技巧
java·ide·intellij-idea
Refrain_zc1 小时前
Android 老设备存储空间展示:机身存储 + TF 卡容量获取完整实现
java
java1234_小锋1 小时前
LangChain4j 开发Java Agent智能体- HelloWorld 实现
java·langchain4j
z落落1 小时前
C# 字段与属性(get/set访问器、三种属性写法、只读属性)+属性拦截例子(get动态计算 + set数据校验)
开发语言·c#
RainCity1 小时前
Java Swing 自定义组件库分享(十)
java·笔记·后端