C#面向对象知识点

  1. 静态方法和非静态方法的区别是什么? 区别就在创建对象的时候,静态方法就一份,而非静态方法每new一个新对象就会把这个实例相关信息在GC Heap上复制一份,同时把new出的新对象放在堆栈上。堆栈指针指的地址是刚刚复制到GC Heap的内存地址。因此在方法调用速度上,静态方法要快一点,因为非静态方法要实例化,分配内存。 从编程历史上看,早期的结构化编程几乎所有的方法都是静态方法,引入实例化方法是面向对象编程以后的事情了,所以实例化方法不是解决运行效率问题,内存问题。是为了让开发更加模式化,面向对象化。

    从上面的分析就可以得出一个结论:1,静态方法和非静态方法是解决模式的区分。2,如果不考虑继承,多态或如果一个方法和它所在类的对象无关,就应该选择静态方法,比如工具类。 https://www.jianshu.com/p/ca544c926eb2

  2. 重写(override)看变量引用(指向),隐式(new)看变量类型。

    1. //重写(override)看变量引用(指向),隐式(new)看变量类型。
    2. Person student2 = new Student();
    3. student2.Print();// 子类new重写会调用父类的方法。 若new的方法要调用子类的方法。
    4. student2.Print2(); //子类override重写会调用子类的方法。
  3. 构造方法调用虚方法是一个需要避免的禁忌(永远不要在非叶子类的构造方法中调用虚方法)。当一个类型被构造时,它的构造顺序是这样的: 执行变量的初始化表达式(子→父) → 执行构造方法(父→子) 所以,当虚方法在基类的构造方法中被调用时,它的类型让然保持的是子类,子类的虚方法将被执行, 但是这时子类的构造方法却还没有完成,任何对子类未构造成员的访问都将产生异常