.NET/C#⾯试题汇总系列:⾯向对象

 1.什么是构造函数?

用于初始化新创建对象的特殊方法。它们没有返回类型,并且其名称与类名相同 

构造函数(Constructor)是一种特殊的方法,它用于在创建对象时初始化该对象
构造函数没有返回类型(连void也没有),并且其名称必须与类名完全相同。
构造函数的主要目的是确保每次创建对象时,对象都能被正确地初始化。

 2.class和struct的区别?

相同点

都可以实现接⼝

不同点

  • 1.class是引⽤类型,struct是值类型
  • 2.class允许继承、被继承,struct不允许,只能继承接⼝
  • 3.class可以初始化变量,struct不可以
  • 4.class可以有⽆参的构造函数,struct不可以,必须是有参的构造函数,⽽且在有参的构造函数必须初始 化所有成员

使⽤场景

  • 1.Class⽐较适合⼤的和复杂的数据,表现抽象和多级别的对象层次时。
  • 2.Struct适⽤于作为经常使⽤的⼀些数据组合成的新类型,表示诸如点、矩形等主要⽤来存储数据的轻量 级对象时,偏简单值。
  • 3.Struct有性能优势,Class有⾯向对象的扩展优势。

 3.简述⼀下⾯向对象的三⼤特性?

  1. 封装:封装是指将数据和操作数据的方法组合在一起,形成一个类。封装的目的是隐藏内部实现细节,只暴露必要的接口给外部使用。这样可以保护数据的安全性,并提高代码的可维护性和可重用性。

  2. 继承:继承是一种创建新类的方式,新类继承了现有类的属性和方法。通过继承,子类可以重用父类的代码,减少重复代码,并且可以在子类中添加新的属性和方法或者覆盖父类的方法。继承提供了一种层次结构,使得代码更加模块化和易于扩展。

  3. 多态:多态是指不同对象对同一消息的不同响应能力。在面向对象编程中,多态允许一个接口或方法在不同的对象上具有不同的实现。这意味着可以使用相同的接口来处理不同类型的对象,而不需要知道对象的具体类型。多态提高了代码的灵活性和可扩展性,使得程序更容易适应变化。

 4.构造函数是否能被重写?

构造函数在C#中不能被重写,但可以被重载来提供不同的初始化方式

在C#中,构造函数(Constructor)是一种特殊类型的方法,用于在创建对象时初始化对象。

它不能被重写(Override),但可以被重载(Overload)。

这是因为构造函数没有返回类型(甚至连void都没有),并且它们的名称必须与类名相同,这些特性使得它们不能按照多态的方式进行重写

 5.抽象类和接⼝有什么区别?

相同点:

都不能直接实例化

不同点:

1.抽象类⽤abstract修饰、接⼝⽤interface修饰

2.抽象类中的⽅法可以实现,也可以不实现,有抽象⽅法的类⼀定要⽤abstract修饰,接⼝中的⽅法不允 许实现

3.抽象类只能单继承,接⼝⽀持多实现

4.抽象类有构造⽅法,接⼝不能有构造⽅法

5.接⼝只负责功能的定义,通过接⼝来规范类的,(有哪些功能),⽽抽象类即负责功能的定义有可以实 现功能(实现了哪些功能)

 6..类的执⾏顺序?

  1. 静态成员‌(包括静态字段和静态构造函数):当类被首次引用时(如创建类的实例、访问类的静态成员等),静态构造函数会执行一次,静态字段会按它们在类中出现的顺序进行初始化(如果它们在声明时就被初始化了)。

  2. 实例成员‌(包括字段、属性、实例构造函数等):当创建类的实例时,首先会执行字段初始化块(如果存在),然后是实例构造函数,构造函数中可能包含对字段的进一步初始化。

  3. 方法‌:类的方法(无论是实例方法还是静态方法)的执行顺序完全取决于它们在代码中的调用顺序。

 7.接⼝是否可继承接⼝?抽象类是否可实现(implements)接⼝?抽象类是否可继承实现类 (concrete class)?

接⼝可以继承接⼝,抽象类可以实现接⼝,抽象类可以继承实现类,但前提是实现类必须有明确的构造函 数。

  • 接口可以继承其他接口,这意味着一个接口可以继承多个接口的成员。这种继承允许创建更复杂的接口,其中包含多个接口的特性。
  • 抽象类可以实现(implements)接口,这意味着抽象类必须提供接口中声明的所有抽象方法的具体实现。抽象类也可以继承其他抽象类,并且可以包含自己的抽象方法和非抽象方法。
  • 抽象类不能直接继承实现类(concrete class),因为实现类是具体的,它提供了所有成员的具体实现。抽象类的目的是定义一种契约,让派生类去实现这些契约,而不是提供具体实现。因此,抽象类只能被继承,而不能被实例化。

 8.继承最⼤的好处?

 对⽗类成员进⾏重⽤,增加代码的可读性、灵活性。

 9.请说说引⽤和对象?

  • 对象和引⽤时分不开的,对象⽣成⼀个地址,放在堆⾥⾯,引⽤则指向这个地址,放在栈⾥⾯。
  • 对象是具有状态和行为的实体,而引用是指向这些对象的指针或标识符

引用(Reference)和对象(Object)是面向对象编程中两个重要的概念。

  1. 对象:对象是面向对象编程的基本构建块,它表示现实世界中的一个实体或概念。每个对象都有一组属性(也称为成员变量或字段)和方法(也称为成员函数或操作)。对象的属性描述了对象的状态,而方法定义了对象的行为。在C#中,对象是通过类来创建的实例。

  2. 引用引用是一个指向对象的指针或标识符。当我们创建一个对象时,实际上是在内存中分配空间来存储该对象的数据,并返回一个指向该内存位置的引用。我们可以使用这个引用来访问和操作对象的属性和方法。引用可以是变量、参数传递、数组元素等。

10.什么是匿名类,有什么好处?

匿名类(Anonymous Class)是指在C#中使用没有显式命名的类。匿名类通常用于创建临时的对象,这些对象只在某个特定的上下文中使用,并且不需要在其他地方引用。

不⽤定义、没有名字的类,使⽤⼀次便可丢弃。好处是简单、随意、临时的

11.重写和重载的区别?

  • 重写(Override):重写是指子类重新定义父类中已有的方法或属性的行为。
  • 重载(Overload):重载是指在同一个类中定义多个同名但参数列表不同的方法。
  • 重写⽅法:关键字⽤override修饰,派⽣类重写基类的⽅法,⽅法命名、返回类型,参数必须相同
  • 重载⽅法:⽅法名必须相同,参数列表必须不相同,返回类型可以不相同。

 12.C#中有没有静态构造函数,如果有是做什么⽤的?

特点: 静态构造函数既没有访问修饰符,也没有参数。在创建第⼀个实例或引⽤任何静态成员之前,将⾃ 动调⽤静态构造函数来初始化类。⽆法直接调⽤静态构造函数。在程序中,⽤户⽆法控制何时执⾏静态构 造函数。 ⽤途 : 当类使⽤⽇志⽂件时,将使⽤这种构造函数向⽇志⽂件中写⼊项。

13.怎样理解静态变量?静态成员和⾮静态成员的区别?

  • 静态变量属于类,⽽不属于对象;
  • 并对所有对象所享;
  • 静态成员在加类的时候就被加载。

14.属性能在接⼝中声明吗?

可以,不能有访问修饰符,不能初始化赋值。

///IProduct接口声明了三个成员:一个无参数无返回值的方法PrintInfo,
///一个有参数有返回值的方法CalculatePrice,以及两个属性Name(只读)和
///Stock(可读可写)。然后,Product类实现了这个接口,并提供了所有接口
///成员的具体实现。public interface IProduct
{// 1. 无参数、无返回值的方法void PrintInfo();// 2. 有参数、有返回值的方法double CalculatePrice(int quantity);// 3. 声明属性// 声明只读属性string Name { get; }// 声明读写属性int Stock { get; set; }
}// 实现接口的类
public class Product : IProduct
{public string Name { get; private set; } // 私有设置器,外部不能修改Namepublic int Stock { get; set; } // 外部可以读写Stockpublic Product(string name, int stock){Name = name;Stock = stock;}public void PrintInfo(){Console.WriteLine($"Product Name: {Name}, Stock: {Stock}");}public double CalculatePrice(int quantity){// 假设单价为10return 10 * quantity;}
}

15.在项⽬中为什么使⽤接⼝?接⼝的好处是什么?什么是⾯向接⼝开发?

  1. 解耦:接口提供了一种抽象的方式来定义对象的行为,使得实现类可以独立于接口的定义进行开发。这意味着如果需要更改接口的实现方式或替换具体的实现类,只需要修改实现类而不需要修改依赖于接口的其他代码。

  2. 提高可扩展性:接口允许多个不同的实现类来满足同一功能的需求。通过定义一个接口,我们可以为不同的场景提供不同的实现,从而增加系统的灵活性和可扩展性。

  3. 支持多态:接口允许我们以统一的方式处理不同类型的对象,只要它们实现了相同的接口。这使得我们可以编写通用的代码,而无需关心具体的对象类型。

  4. 便于测试:接口提供了一种隔离实现细节的方法,使得我们可以针对接口进行单元测试,而不必关心具体的实现细节。这有助于提高代码的质量和可靠性。

  5. 促进代码重用:接口可以作为公共契约,被多个不同的类所实现和使用。这样可以减少重复代码,并提高代码的可维护性和可读性。

 16.什么时候⽤重载?什么时候⽤重写?

当⼀个类需要⽤不同的实现来做同⼀件事情,此时应该⽤重写,⽽重载是⽤不同的输⼊做同⼀件事情。

  • 使用重载的场景:当你需要在同一个类中实现多个功能相似但参数不同的方法时,可以使用重载。例如,一个计算器类可以有多个加法方法,分别接受整数、浮点数、字符串等不同类型的参数。
  • 使用重写的场景:当你需要在子类中扩展或修改父类的行为时,可以使用重写。例如,假设有一个动物类和一个狗类,狗类继承了动物类并重写了动物类的叫声方法,以提供狗特有的叫声。

17.静态⽅法可以访问⾮静态变量吗?如果不可以为什么?

静态方法无法直接访问非静态变量,因为它们不共享相同的生命周期和存储位置。如果需要在静态方法中使用非静态变量,可以通过创建类的实例来访问这些变量,或者将非静态变量改为静态变量。

 18.在.Net中所有可序列化的类都被标记为____?

[serializable]

19.C#中 property 与 attribute的区别,他们各有什么⽤处,这种机制的好处在哪⾥?

⼀个是属性,⽤于存取类的字段,

⼀个是特性,⽤来标识类,⽅法等的附加性质

20.能⽤foreach遍历访问的对象需要实现 接⼝或声明⽅法的类型

 答:IEnumerable 、 GetEnumerator。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/417929.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kaggle竞赛——手写数字识别(Digit Recognizer)

目录 1. 数据集介绍2. 数据分析3. 数据处理与封装3.1 数据集划分3.2 将数据转为tensor张量3.3 数据封装 4. 模型训练4.1 定义功能函数4.1 resnet18模型4.3 CNN模型4.4 FCNN模型 5. 结果分析5.1 混淆矩阵5.2 查看错误分类的样本 6. 加载最佳模型7. 参考文献 本次手写数字识别使用…

Lenze伦茨E82ZBC, E82ZBB E82ZMBRB安装说明手测

Lenze伦茨E82ZBC, E82ZBB E82ZMBRB安装说明手测

景联文科技:提供高质量多模态数据标注,推动智能化转型

随着人工智能技术的快速发展,多模态数据标注成为推动智能系统更深层次理解和应用的关键技术之一。 作为行业领先的多模态数据标注服务商,景联文科技凭借其在技术、流程和人才方面的综合优势,推出了全面的多模态标注解决方案,助力…

828华为云征文|部署电影收藏管理器 Radarr

828华为云征文|部署电影收藏管理器 Radarr 一、Flexus云服务器X实例介绍1.1 云服务器介绍1.2 应用场景1.3 性能模式 二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Radarr3.1 Radarr 介绍3.2 Docker 环境搭建3.3 Radarr 部署3.4 R…

枚举: C++和Python实现鸡兔同笼问题

作者制作不易,关注、点赞、收藏一下吧! 目录 1.Python实现 2.C实现 1.Python实现 首先,我们需要输入头和脚的数量: head int(input("请输入头的数量: ")) feet int(input("请输入脚的数量: ")) input() 实现输入…

ChauffeurNet:通过模仿最佳驾驶和合成最坏情况进行学习驾驶

ChauffeurNet: Learning to Drive by Imitating the Best and Synthesizing the Worst ChauffeurNet:通过模仿最佳驾驶和合成最坏情况进行学习驾驶 https://arxiv.org/abs/1812.03079 Abstract Our goal is to train a policy for autonomous driving via imit…

基于卷积神经网络的磨削平板类零件擦伤检测

基于卷积神经网络的磨削平板类零件擦伤检测 前言正文 前言 还记得读研那会儿刚学习完了卷积神经网络,初步学会了最基础的分类问题,当时也有点python基础,同时对TensorFlow也有点入门了。正好我的课题中有一类缺陷比较难以用传统方法识别判断&…

【LeetCode】01.两数之和

题目要求 做题链接:1.两数之和 解题思路 我们这道题是在nums数组中找到两个两个数使得他们的和为target,最简单的方法就是暴力枚举一遍即可,时间复杂度为O(N),空间复杂度为O(1)。…

【JAVA入门】Day34 - Stream流

【JAVA入门】Day34 - Stream流 文章目录 【JAVA入门】Day34 - Stream流一、Stream 流的作用和使用步骤1.Stream流的创建,数据的添加2. Stream流的中间方法3. Stream流的终结方法 Stream 流有什么作用?我们看一个例子: 【练习】需求&#xff…

C++入门(01)VisualStudio2022社区版HelloWorld

文章目录 1. 下载社区版2. 安装3. 启动4. 创建新项目5. C空项目6. 项目名称和位置7. 创建后,出现“新增功能”,关闭即可8. 解决方案和项目9. 新建源文件10. 编辑第一个C程序11. 运行该程序12. Debug文件夹13. 用好Microsoft Learn 1. 下载社区版 访问&a…

JavaScript 循环分支语句-dowhile循环

do/while 循环是 while 循环的变体。该循环会在检查条件是否为真之前执行一次代码块&#xff0c;然后如果条件为真的话&#xff0c;就会重复这个循环。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta htt…

网页时装购物系统:Spring Boot框架的创新设计

第1章 绪论 1.1背景及意义 随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。人们生活水平的不断提高&#xff0c;日常生活中人们对时装购物系统方面的要求也在不断提高&#xff0c;喜欢购物的人数更是不断增加&#xff0c;使得时装购物系统的开发成为必需而且紧迫的…

一种非接触式智能垃圾桶设计(论文+源码+实物)

1系统方案设计 通过对需求展开分析&#xff0c;本设计非接触式智能垃圾桶采用STM32F103单片机作为控制器&#xff0c;通过红外传感器实现垃圾桶的满溢检测&#xff0c;通过三个SG90舵机分别控制可回收、不可回收、其他垃圾桶盖的开关&#xff0c;并通过WiFi通信模块将数据信息…

EmguCV学习笔记 VB.Net 9.2 VideoWriter类

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

c++一个数因子和(快速求解)

void 一个数因子和(int 整数) {//缘由https://ask.csdn.net/questions/1054457#answer_1251715int he 0, j 0; string a "";while (j < 整数)if (!(整数%j))he j, a to_string(j) "";cout << a << "的因子和&#xff1a;" …

Opencv中的直方图(1)计算反向投影直方图函数calcBackProject()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算直方图的反向投影。 cv::calcBackProject 函数计算直方图的反向投影。也就是说&#xff0c;类似于 calcHist&#xff0c;在每个位置 (x, y)…

ITK-高斯滤波

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 高斯滤波原理 高斯滤波&#xff08;Gaussian Blur&#xff09;是数字图像处理中常见的一种平滑滤波器&#xff0c;旨在通过模糊处…

OpenCV结构分析与形状描述符(10)检测并提取轮廓函数findContours()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在二值图像中查找轮廓。 该函数使用算法 253从二值图像中检索轮廓。轮廓是有用的工具&#xff0c;可用于形状分析和对象检测与识别。参见 OpenC…

Linux下安装MySQL8.0

一、安装 1.下载安装包 先创建一个mysql目录&#xff0c;在将压缩包下载到此 # 下载tar包 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz等待下载成功 2.解压mysql8.0安装包 tar xvJf mysql-8.0.20-linux-glibc2.12-x86…

visual studio 2022更新以后,之前的有些工程编译出错,升级到Visual studio Enterprise 2022 Preview解决

系列文章目录 文章目录 系列文章目录前言一、解决方法 前言 今天遇到一个问题&#xff1a;visual studio 2022升级成预览版以后&#xff0c;之前的有些工程编译出错。首先代码、项目设置都没有改变&#xff0c;只是更新了visual studio 2022。 在编译工程时&#xff0c;编译器…