CShape(.NET) 面向对象常见面试题

文章内的面试题涉及以下相关内容:
1.开发语言:CShape
2.数据库:SQL Server、Redis
(注:此文章内的面试题及答案均为个人整理,如有什么不足之处请在评论区或者私信内多多指教或反馈~
更多相关面试题正在逐步整理中…)

基础理论知识题

0.什么是面向对象开发?面向对象的三大基本特征是什么?(重点!!)

通俗来讲就是像描述现实生活中的情况进行程序开发,针对某一件事务来设计相对应的功能。
例如我们要开发个售票系统,则会想到要设计用户登录,购票,票数统计等等一系列用户可能会需要的功能。从而让程序设计的更完善。

面向对象的三大基本特征:封装、继承、多态

1.什么是构造函数?

属于一种方法,用于在创建对象时初始化对象,给对象成员变量赋初始值。并且构造函数的命名也必须要与类名完全相同,构造函数也不能被直接调用,需要通过new运算符在创建对象时才会进行自动调用。

2.什么是类?什么是对象?

类:对象的模板,用于封装定义的成员变量和构造方法,属于引用类型。
对象:类当中的一个具体实例

3.简述方法定义的几种方式

定义方法:方法类型 返回类型 方法名(参数列表){ }
也可以使用virtual重写方法、abstract在抽象类中重写方法、override重写基类方法。

4.静态方法与非静态方法的区别

●静态的变量在类之间是共享的,非静态的是类的实例化对象独享的,
●静态方法可以通过类名.方法名的形式进行调用,不会产生内存开销,非静态的方法,需要实例化类的对象, 将方法保存到代码区中个,然后通过对象.方法名的方式进行调用。
●静态方法中调用非静态方法,需要先实例化非静态的方法对象,再通过对象.方法名的方式进行调用。
●非静态方法中可以直接调用静态方法与非静态方法。

5.类的组成部分有哪些?

成员变量、构造方法、引用的命名空间

6.成员变量与局部变量的区别
  1. 在类中的位置不同
    成员变量:在类中方法外
    局部变量:在方法定义中或方法声明上。
  2. 在内存中的位置不同
    成员变量:在堆内存中
    局部变量:在栈内存中
  3. 初始化值不同
    成员变量:有默认值
    局部变量:没有默认值,必须定义,赋值,然后才能使用
  4. 生命周期不同
    成员变量:随着对象的创建而存在,随着对象的消失而消失
    局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
7.什么是方法重载?

方法名相同,参数类型或参数个数不同

8.写出常用的访问修饰符,按由小到大排序。
  1. private:私有的,仅本类中可访问
  2. protected:受保护的,在类的继承过程中可访问
  3. internal:此程序集可访问
  4. public:共有的
9.列举所掌握的所有数据类型,按分类写

基本数据类型(值类型)
整数类型:byte、short、int、long
浮点类型:float、double、decimal
字符型:char
布尔类型:bool

引用类型
字符串:string
对象:object

10.什么是异常?异常的基本结构是什么?

程序运行时产生的错误称为异常。

try:对可能抛出异常的代码进行包裹
catch:用于指定要捕获的异常类型,从而进行相应处理
finally:无论是否抛出异常都会执行的代码块

11.String与StringBuffer的区别

string是基本类型,是不可改变对象,一旦被创建就不能修改它的值。对已经存在的string对象的修改都是重新创建一个新的对象,然后将新值保存进去。而StringBuffer是一个可变对象,当对它进行修改时不会像string那样重新建立对象。它只能通过构造函数来建立。对象被建立后,在内存中就会分配内存空间,并初始保存一个null,向StringBuffer中赋值的时候可以通过它的append()方法。字符串连接操作中StringBuffer的效率要比stirng高。

12.什么是封装性?好处是什么?

封装是将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
封装的好处:隐藏类的实现细节、只能通过规定方法访问数据、方便加入控制语句及修改实现。

13.什么是继承?继承的特点及关键字是什么?

继承是允许根据一个类来定义另一个类。当创建一个类时,可以不用重新编写新的数据成员及成员函数,只需要设计一个新的类,然后继承已有类的成员即可,已有的类称为基类,新的类则称为派生类。关键字是:符号。

14.继承的优点有哪些?如果父类与子类同样的方法,不同的功能怎么处理?

优点:简化了子类的定义及扩展了父类的定义。

可以使用方法重写或者方法重载进行处理。

15.什么是方法重写?好处是什么?

“重写”父类方法就是修改它的实现方式或者说在子类对它进行重新编写。

好处就是代码的重用性集扩充性更强。

16.什么是多态性?多态性的好处是什么?

同一操作作用于不同的对象,可以有不同的解释,产生不同的效果,这就是多态性。
多态具有可替换性、可扩充性、接口性、灵活性及简化性这些好处。

17.多态的实现条件有哪些?

要有继承、重写、父类引用指向子类对象三个条件。

18.什么是抽象方法?与普通方法的区别是什么?

只需要定义,而不需要实现的方法称为抽象方法。
区别:抽象方法没有方法体,没有方法具体实现、抽象方法只能在抽象类中声明、派生类必须重写抽象类中的抽象方法。

19.什么是抽象类?

包含抽象方法的类称为抽象类。

20.什么是接口?

接口是一种用来定义程序的协议,它描述可属于任何类型或结构的一组相关行为。接口可有方法、属性、事件和索引器或这四种成员的任何组合类型,但不能包含字段。

21.抽象类与接口的区别是什么?

● 接口可以多继承,抽象类不能实现多继承。
● 接口只能定义抽象规则,抽象类即能定义抽象规则也能提供已实现的成员。
● 接口是一组行为规范,抽象类时一个不完全的类,着重于族的概念。
● 接口支持回调,抽象类不能实现回调,因为继承不支持。
● 接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法,抽象类可以定义属性、字段、包含有实现的方法。
● 接口多定义对象的行为,抽象类多定义对象的属性。
● 接口可以作用于值类型和引用类型,抽象类只能作用于引用类型。

22.简述一下什么情况下使用抽象类?什么情况下使用接口?

接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。
而抽象类在代码实现方面发挥作用,可以实现代码的重用。

23.ADO.NET的五个主要对象

connection、command、reader、adapter、dataset

24.三层架构有哪几层?每层作用是什么?

视图层(ui):负责显示和采取用户操作,不包含任何业务相关的逻辑处理。
业务逻辑层(BLL):通过获取Ui传来的用户指令,执行业务逻辑,在需要访问数据时,直接交给DAL进行处理,然后返回数据给Ui层。
数据访问层(DAL):只提供基本的数据访问,不包含任何的业务逻辑。

25.什么是装箱(boxing)和拆箱(unboxing)?

装箱:将值类型转换成引用类型(Object)
拆箱:将引用类型转换成值类型

26.String s = new String(“xyz”); 创建了几个String Object?

两个;一个可以被引用的“s”对象,一个括号里面的值。

27.值类型和引用类型的区别?

值类型存储在栈内存,长度都是固定的;引用类型存储在堆内存,可以动态扩展长度。

28.是否可以继承String类?

不可以继承。因为String类有final修饰符,使用final修饰的类时不允许被继承的。

29.try()里有一个return语句,那么紧跟在这个try后的finally()里的code会不会被执行?在什么时候被执行?

会执行;在return语句之前被执行。

30.new关键字的用法有哪些?

new运算符:用于创建对象和调用构造函数。
new修饰符:在用作修饰符时候,new关键字可以显式隐藏从基类继承的成员。
new约束:用于在泛型声明中约束可能用作类型参数的参数类型。

31.override与overload的区别?

override是重写方法,方法名,返回值以及参数相同,存在于父类和子类之间。
override是重载方法,参数类型、个数、顺序至少要有一个不相同,存在于父类及子类中。

32.在C#中,string str = null 与 string str = “” 的区别

null在内存中没有分配内存空间,“”则分配了空间。
为null的字符串没有被实例化,而为“”的字符串则已经被实例化。

33.请详述在dotnet中类(Class)与结构(struct)的异同?

Class可以被实例化,属于引用类型,分配在堆内存中,可以实现接口和单继承其他类。
struct属于值类型,分配在栈内存中,可以实现接口,不能作为基类型,而Class可以。

34.接口能否继承接口,抽象类能否继承接口,抽象类能否继承普通类?

接口可以继承接口、抽象类不能继承接口,但可以实现接口、抽象类可以继承普通类。

35.构造器Constructor是否可以被继承?是否可以被override?

构造器不能被继承,也不可以被重写(override)

36.进程和线程分别该怎么理解?

进程指运行中的应用程序,每个进程都有自己独立的内存空间,而线程是属于进程中的一个实体,没有独立的内存空间,寄生在进程当中。

37.DataReader与DataSet的区别?

DataReader在使用时会始终占用SQLConnection,任何对SQLConnection的操作都会引发DataReader的异常,且每次读取时只在内存中加载一条数据,占用的内存相对较小。
DataSet则会将数据一次性的加载到内存中,读取完毕后会放弃数据库连接,相对来说会比较消耗内存。但会比DataReader更灵活,可以动态的添加行、列数据,对数据库进行回传更新操作。

38.什么是虚函数?什么是抽象函数?

用virtual关键字修饰的成员函数称为虚函数,用于实现多态性。
没有执行代码,只定义了的函数称为抽象函数。

39.描述一下virtual、sealed、override和abstract的作用。

virtual:字面意思为虚拟,用于将类中成员定义成虚拟的,表示这些成员会在继承后重写其中的内容。
sealed:字面意思为密封的,用此修饰符修饰的类或方法不能被继承。
override:用于重写继承的父类当中的方法。
abstract:用于将类、方法、属性、事件和索引器定义为抽象的。

40.什么是成员变量?什么是局部变量?

成员变量是类中定义的变量、局部变量是在方法内定义的变量。

41.简述子类实例化的过程
  1. 产生对象并对成员默认初始化。
  2. 对构造方法中的形式参数赋值。
  3. 检查构造方法中是否有this语句。
  4. super调用或隐式调用父类的构造方法。
  5. 对当前类中的变量显式初始化。
  6. 执行当前构造方法中的代码。
42.this与base的区别

this关键字可以访问当前类中定义的字段、属性、和方法。
base关键字可以调用当前类继承的父类中的字段、属性和方法。

43.当一个线程进入对象的一个synchronized方法后,其他线程是否可以进入此对象的其他方法?

不可以,因为一个对象的一个synchronized方法只能由一个线程访问。

44.什么是事务?简述事务的编写流程

事务是指为单个逻辑单元执行的一系列操作。

执行步骤:

  1. 创建事务所使用的一些对象(SqlConnection、SQL语句、SqlCommand)。
  2. 实例化SqlTransaction类。
  3. 使用这个事务所使用的con连接。
  4. 使用BeginTransaction方法执行这个事务。
  5. 在try{ }块里执行SQLCommand命令。
  6. 如果执行成功则执行commit()提交,否则执行rollback()回滚操作。
45.事务的特性有哪些?

事务具备原子性、一致性、隔离性、持久性4大特性。

原子性(atomic):
事务中包含的各项操作必须全部执行或全部不执行。任何一项操作失败都会导致整个事务失败,其他已执行的任务所做的数据操作都会被撤销。只有所有的操作全部成功了,整个事务才算执行完成。

一致性(consistent):
保证了当事务结束后,系统状态是一致的。

隔离性(isolated):
使得并发执行的事务,彼此无法看到对方的中间状态。保证了并发事务的顺序执行,而不会导致系统状态不一致。

持久性(durable):
保证了事务完成后所作的改动都会被持久化。如果资源发生故障,可以通过日志将数据重建起来。

46.CTS、CLR、CLS分别是什么?

CTS:通用类型系统、CLR:公共语言运行时、CLS:公共语言规范

这三个是.NET Framework 3C 标准

47.什么是GC,GC的作用是什么?

GC是一种垃圾回收机制;用于回收堆内存中没有使用过的对象或变量,从而释放内存。

48.数据表中有user表,字段ID、name、创建时间,写出获取最新一条注册用户信息。
SELECT TOP * 1 FROM user
ORDER BY 创建时间 DESC
49.启动一个线程是run方法还是start方法?

启动一个线程是使用start()方法。

50.SQL函数与存储过程的区别是什么?
  1. Sql函数可以被select调用,而存储过程不可以
  2. 存储过程返回多样化,sql函数只能返回值或者表对象
  3. 他们都支持Procedure cache模式
51.什么是视图?视图的作用是什么?

视图是一组查询的封装,是属于虚拟表(Create View)

作用包括:

  1. 数据安全性(自定义对外的展示数据与字段)
  2. 方便程序端调用,提升网络传输效率
52.SQL主键与外键的区别是什么?

外键是参照关系表的主键,体现的是表之间的关系,主键是表中实体的唯一标识(表中外键可以重复,主键内容必须唯一)。

53.数据量访问过大的解决方案有哪些?
1.读写分离 (会造成数据延迟)
2.分表分库
3.按业务将数据库分割
54.Redis的使用场景有哪些?
1.缓存类数据
2.文字评论、点赞功能
55.Redis可存储的数据类型有哪些?
1.字符串 (String)
2.哈希 (Hash):散列
3.列表 (list)
4.集合 (set)
5.有序集合 (sorted sets)

代码题

1.分析下面代码
using System;
class A
{
	public A()
	{
		PrintFields();
	}
	public virtual void PrintFields() { }
}
class B : A
{
	int x = 1;
	int y;
	public B()
	{
		y = -1;
	}
	public override void PrintFields()
	{
		Console.WriteLine("x={0},y={1}",x,y);
	}
}
当使用new B()创建B的实例时,会产生什么输出?

执行后代码为:

x=1,y=0
2.分析下面代码
string strTmp = "abcdefg某某某";
int i = System.Text.Encoding.Default.GetBytes(strTmp).Length;
int j = strTmp.Length;
以上代码执行完成后,i = ( ),j = ( )

答:i = 13,j = 10

总结:i 是计算字节长度的,而 j 是计算字符串长度的,两个计算方法不同。

3.分析下面代码
private int Method()
{
	static int num = 0;
	num += 1;
	return num;
}
问以上代码会出现什么样的错误?

会出现编写性错误;错误原因是:不能在方法内声明静态变量。


tip:这里面整理的题都是我之前练习过的题,可能在面试过程中提问到的概率比较大,特此放到这里供大家参考。
有的题目是我按照自己的理解答的,部分题目的答案是来自网络。
更多题目正在陆续整理,我会不定期的更新题目的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血码农ZL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值