来源:《dotNET跨平台》 微信公众号,十分感谢。
问题:
-
1.通常采用的访问修饰符有哪五种
-
2.多态的理解
-
3.什么是构造函数
-
4.重写和重载的区别
-
5.class和struct的异同
-
6.构造函数是否能被重写?
-
7.简述一下面向对象的三大特性
-
8.抽象类和接口有什么区别?
-
9.类的执行顺序
-
10.接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承实现类(concrete class)?
-
11.继承最大的好处?
-
12.请说说引用和对象?
-
13.什么是匿名类,有什么好处
-
14.有哪些引用类型,有哪些值类型,有什么区别
-
15.C#中有没有静态构造函数,如果有是做什么用的?
-
16.怎样理解静态变量?静态成员和非静态成员的区别?
-
17.在项目中为什么使用接口?接口的好处是什么?什么是面向接口开发?
-
18.属性能在接口中声明吗?
-
19.什么时候用重载?什么时候用重写?
-
20.静态方法可以访问非静态变量吗?如果不可以为什么?
答案:
1.public/internal/internal protected/protected/private 注意internal protected是二者作用范围的和,本项目中或者父类子类可以访问
2.解释:同一操作作用于不同的对象,实现不同的结果。作用:增强代码的灵活性、重用性和可读性。 实现:通过派生类、复写基类的虚方法。注意,面向对象的四个基本特征:抽象、封装、继承、多态。
3. 概念:构造函数的方法名与类名相同,没有返回值,用于完成对类的对象的初始化。
创建一个类的新对象时,系统会自动调用该构造函数初始化对象,如果没有写定义,系统会自动提供一个默认的不带任何参数的public构造函数。
4.重写和重载的区别:
重写方法派生类是对父类的virtual修饰的虚方法进行override重写,重写的方法与基类方法方法名、返回类型和参数必须都相同。重写方法的目的是实现多态。
重载方法只是在一个类中,有相同的方法名,但是参数列表不同(返回值不同不属于函数签名不同)。重载方法只是为了调用名字相同但是参数不同的方法以针对不同的使用环境,.net提供的方法大多都有很多重载。
5.相同点:都可以实现接口
不同点:1.class是引用类型,struct是值类型
2.class允许继承,但struct只能实现接口,不能继承
3.class可以有无参数构造函数,struct不可以有显示的无参数构造函数,必须是有参数构造函数,而且在有参数的构造函数中必须初始化所有成员。
使用场景:1.class比较适合大的复杂的数据,表现抽象和多级别的对象层次时。Struct适合用于由常用的数据组合而成的新类型,比如点、矩阵等,主要用来存储数据的轻量级对象,偏向于简单值类型。
2,struct有性能优势,但是class有良好的扩展优势。
6.构造器Constructor不能被继承,因而不能被重写,但是可以重载。
7.封装、继承和多态。封装是指通过把对象的属性和实现细节隐藏起来,仅对外提供公共的访问方法;继承是通过子类继承基类、继承抽象类、继承接口实现的;多态:是通过重写基类的虚方法实现的。
好处是方便维护,以扩展;缺点是性能比面向过程低。
8.相同点:都不能直接实例化
不同点:1.抽象类用abstract修饰,接口用interface修饰 2.接口的目的是表明继承类拥有的功能(方法),并且给出了这些方法的规范(方法名,返回值,参数类型等)而不给具体实现,抽象类的目的同样是表明继承类应该拥有的方法,但是不仅可以给出方法的规范(该方式用abstract修饰方法),而且还可以给出已经实现的方法(不用abstract修饰,直接实现方法)。注意:抽象类中既可以有普通方法,也可以有抽象方法,也可以有虚方法。
9.更有意义的问题:实例化类的执行顺序如何?
1.不考虑继承关系:(先公后私)
- 静态字段
- 静态构造方法
- 实例字段
- 实例构造方法
2.考虑继承关系:
- 子类的静态字段
- 子类的静态构造方法
- 子类的实例字段
- 父类的静态字段
- 父类的静态构造方法
- 父类的实例字段
- 父类的实例构造方法
- 子类的实例构造方法
多数时候问到的都是关于子类实例化过程中,其构造函数与父类构造函数之间的先后问题。如果不是静态构造方法,则是先父类在子类,如果有静态构造方法,那么是子类静态构造方法、父类静态构造方法、父类实例方法、子类实例方法。
10.接口可以继承接口,抽象类可以实现接口,抽象类可以实现继承类,但是前提是实现类必须有明确的构造函数。
11.继承最大的好处就是重用,增加代码的可读性和灵活性。
12.对象和引用是分不开的,对象生成一个地址,放在堆中,引用则指向这个地址,放在栈中。引用就是一个指向。
13.匿名类不用定义,直接产生一个对象,并给出对象的属性。使用方法是在某个类中,直接用var 对象 = new{ 各个字段赋值}即可产生该对象。
14.引用类型:类,接口,委托,字符串,数组;值类型:整形,浮点型,结构体,枚举,bool;二者的区别在与值类型的变量直接存储实际的数据,引用类型的变量存储的只是数据的一个引用,默认情况下,值类型的值为0,引用类型为null
15.静态构造函数不允许有访问修饰符,也没有参数,在创建一个实例或者引用之前,将自动调用静态构造函数来初始化类、无法直接调用静态构造函数,在程序中,用户不能直接控制静态构造函数的执行。用途:当类使用日志文件时,将使用这种构造函数想日志文件中写入内容。
16.静态变量属于类,而不属于对象,并向所有对象开放共享,静态成员在类产生时就被加载。
17.接口是一种约束,描述类的公共方法或者属性,不能有任何实现,好处是结构清晰,类之间的通信简单易懂,扩展性好,复用性高。
18.属性可以在接口中声明,但是不可以有访问修饰符,也不能初始化值。
19.当一个类需要不同的实现来做同一件事情,此时应该重写,而重载时用不同的输入做同一件事情。
20.静态方法和非静态变量不是同一生命周期,静态方法属于类,非静态变量属于具体的对象,当然二者没有任何关联。