首页 > 代码库 > 面向对象

面向对象

什么是虚方法呢?
l虚方法可以给父类中的方法一个实现,比如ToString()方法
l虚方法必须有实现部分,哪怕是空实现,实现。

子类都要对他进行重写

 

什么是抽象方法呢?

抽象类必须加abstract关键字, 抽象方法必须没有实现,,sonLoad();在子类必须重写。而虚方法可以被重写,

 

 

虚方法和抽象方法的区别:1.虚方法必须有实现,抽象方法必须没有实现
2.抽象方法必须在抽象类中声明,虚方法可以出现在抽象类中
3.抽象方法必须在子类中重写,虚方法可以被重写

 

实现多态的主要手段:

1.虚方法virtual

2.抽象方法abstract

3.接口。

 

 

关于虚方法需要注意的几点:

1.父类中如果有方法需要让子类重写,则可以将该方法标记为virtual

2.虚方法在父类中必须有实现,哪怕是空实现。

3.虚方法子类可以重写(override),也可以不重写。

 

 

 

静态成员、静态类在程序中的任何一个地方都可以访问。

 

不会因为超出了方法的作用域而不能访问。

所以静态成员、静态类只有在程序退出的时候才会释放资源。

静态构造函数必须用static关键字标记

静态构造函数不能有访问修饰符

静态构造函数不能有参数。

静态构造函数只会被调用一次。在第一次使用静态类前。

静态类不能被实例化,就不会有对象,而this表示的是当前对象。所以在静态类不能使用this.

  static StaticClass()

   {

    }

 

多态的作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

 

 

类型:

 

值类型:

intchardoublefloatlongshortbyteboolenumstructdecimal

值类型都是派生自ValueType

值类型不能继承,只能实现接口。

 

引用类型:

string、数组、类(子定义数据类型)、接口、委托、

int[] n={1,2,3};//引用类型。

引用类型都派生自:Object

引用类型可以继承(类之间可以继承)

 

枚举

 一组和数值有关的常量

  enum Gender { Male,Female}

  enum Weeks { 星期日=0,星期一,}

 把字符串转换成枚举Gender g = (Gender)Enum.Parse(typeof(Gender), "Male");

 

结构

 就是小类,值类型

不能继承类

可以实现接口

不能有显示无参构造函数(隐式)

结构中不能给字段赋初始值

 

值类型:拷贝文件

引用类型:文件的快捷方式。

 

接口:

接口定义一种能力,子类继承抽象类,实现接口,接口中的成员必须不能有实现,接口中的成员不能有访问修饰符,隐式公开,接口中可以有属性、方法、索引器等,但不能有字段,接口中的所有程序必须被子类中全部实现

 

一个类只能有一个父类,一个类可以实现多个接口。接口只能决定能干什么,怎么干由类来实现

 特点总结:

1.接口是一种规范。为了多态。
2.接口不能被实例化。
3.接口中的成员不能加“访问修饰符”,接口中的成员访问修饰符为public,不能修改。(默认为public
4.接口中的成员不能有任何实现(“光说不做”,只是定义了一组未实现的成员)。
5.接口中只能有方法、属性、索引器、事件,不能有“字段”。
6.接口与接口之间可以继承,并且可以多继承。
7.实现接口的子类必须实现该接口的全部成员。
8.一个类可以同时继承一个类并实现多个接口,如果一个子类同时继承了父类A,并实现了接口IA,那么语法上A必须写在IA的前面。class MyClass:A,IA{},因为类是单继承的。
9.当一个抽象类实现接口的时候,如果不想把接口中的成员实现,可以把该成员实现为abstract(抽象类也能实现接口,用abstrac标记)
10.“显示实现接口”,只能通过接口变量来调用(因为显示实现接口后成员为private)。
 

 

 

 

 

抽象类和接口的区别

接口定义类的公共行为,抽象类定义类的公共实现

一个类只能继承自一个类(抽象类),但是可以同时实现多个接口

接口中不能有实现,抽象类中可以有未实现成员也可以有实现的成员

接口中未实现的方法必须在子类中实现,抽象类中未实现的成员必须在子类中重写

好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。   

什么时候使用抽象类,什么时候使用接口
 抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。
1.飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。
2. 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。 门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。

 

 

什么情况下会发生隐式类型转换?

1.把子类类型赋值给父类类型的时候会发生隐式类型转换。

2.将占用字节数小的数据类型赋值给占用字节数大的数据类型可以发生隐式类型转换(前提是这两种数据类型在内存的同一个区域。)

 

常用类库StringBuilder:
当大量进行字符串操作的时候,比如,很多次的字符串的拼接操作。
String 对象是不可变的。 每次使用 System. String 类中的一个方法时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。 在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常大。 如果要修改字符串而不创建新的对象,则可以使用 System.Text. StringBuilder 类。 例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。 

 用法:

StringBuildersb = new StringBuilder();
sb.Append();//追加字符串
sb.ToString();//StringBuilder转换为字符串。
sb.Insert();
             sb.Replace();

 

 关于。Net的垃圾回收:

l垃圾回收的目的:提高内存利用率。
l垃圾回收器,只回收托管堆中内存资源,不回收其他资源(数据库连接、文件句柄、网络端口等)。
l什么样的对象才会被回收?
没有变量引用的对象。没有变量引用的对象,表示可以被回收了(null,断了线的风筝,再也回不来了。
大学食堂(自己收盘子)、大排档(不需要程序员自己收盘子)
l什么时间回收?
不确定,当程序需要新内存的时候开始执行回收。
GC.Collect();//手动调用垃圾回收器。不建议使用,垃圾回收时会暂停一下(非常短暂)让程序自动去GC
l垃圾回收器中“代”的概念:
3代:第0代、第1代、第2代。
各代的回收频率:第0代最高,其次第1代,再次第2代。也就是说越老的对象生存几率越大。
l.net中垃圾回收机制:mark-and-compact(标记和压缩),一开始假设所有对象都是垃圾。
l除了内存资源外的其他资源怎么办?~或者Dispose()

 关于拆箱跟装箱:

l装箱、拆箱必须是: 值类型→引用类型  或 引用类型→值类型。
l            //object,接口。值类型是可以实现接口。
l            //Person p=new Student();//这个叫隐式类型转换,不叫装箱。
l            //Student stu=(Student)p;//这个叫显示类型转换,不叫拆箱。
l            //int类型为什么能装箱到object类型,但不能装箱到string类型或Person类型,
l            //因为object类型int类型的父类。
l            //2.拆箱时,必须用装箱时的类型来拆箱
l            //装箱时如果是int,拆箱必须用int,不能用double
l
l //3.方法重载时,如果具有该类型的重载,那么就不叫拆箱或装箱。
int n=10; Console.WriteLine(n);//没有发生装箱,因为方法重载。
l//4.接口与值类型之间的装箱与拆箱。
l            //5.字符串连接:1+”aaa”+100,发生了几次装箱
l            // string.Concat(s1, s2, n3, d4);判断是否发生了装箱,及次数。
l==============================================================
l //装箱了吗?
l            string s = "123";
l            int n = int.Parse(s);
l
l            //拆箱了吗?
l            string s1 = n.ToString();