初识c#---继承和继承关系中的构造函数

时间:2021-06-20 19:29:58
 1.构造函数     构造函数的语法格式:     修饰符 + 类名(){         }     构造函数的作用:实例化对象,快速初始化对象         构造函数的特点:    1.如果类中没有构造函数,系统会为每一个类生成一个默认的构造函数     2.如果类中存在带有参数的构造函数,系统就不会为类生成默认的构造函数      此时如果调用 new Cat()(没有传参);时会报错.       解决办法有两个:1.为类添加默认的构造函数                                 2.new Cat(传参数);     3.构造函数是没有返回值的   如果类中没有构造函数,系统会为每一个类生成一个默认的构造函数     2.继承     继承的语法     A:B 即A类继承自B类     Enemy enemy=new Boss();//父类声明的对象,可以通过子类去构造,子类声明的对象不可以使用父类去构造 Boss boss=(Boss)enemy;//enemy虽然使用了父类声明,但是使用了子类构造 ,所以本质上是一个子类类型的,我们可以强制类型转换成子类类型
Enemy enemy=new Enemy(); Boss boss=(Boss)enemy;//一个对象是什么类型的 主要是看它是通过什么什么构造的,这里enemy是使用了父类的构造函数,所以只有父类中的字段和方法,不能被强制转换成子类
 继承的特点:     1.子类会拥有父类所有的公开字段/属性/方法     2.父类不会拥有子类的字段/属性/方法     3.如果子类和父类出现相同的字段/属性/方法,以子类为准     4.子类可以出现在任何父类出现的地方,子类可以替换父类, 父类不能直接替换子类(需要强制转换  s=(Son)f;)       Father f = new Son();       编译时f的类型是Father,运行时f的类型是Son     5.如果子类出现和父类相同的方法名时,如果想隐藏父类方法,       需要在子类方法修饰符后加上new关键字(其实有没有new都行),防止后期程序过大时出现Bug(有待验证).  隐藏方法:     如果使用子类声明对象时,调用隐藏方法会调用子类的  Boss b=new Boss();     b.Move();     如果使用父类声明对象时,就会调用父类中的隐藏方法 Enemy e=new Boss();   e.Move();     6.base关键字代表父类对象     7.一个子类不可以拥有多个父类(父类除了object类)     8.父类可以拥有多个子类       继承中的构造函数特点:     1.如果两个类存在父子关系,那么在实例化子类的时候,首先会调用      父类的无参数构造函数,然后再调用子类的构造函数     2.实例化子类对象的时候,可以指定子类构造函数调用父类中存在的任意构造函数       使用关键字:base()       :base()  ----指定子类构造函数调用父类的无参数构造函数       :base(a)  ---指定子类构造函数调用父类带有一个参数的构造函数         这里需要注意的是:     我们在实例化子类对象的时候,一定要关注构造函数的特点;     /// 研究继承关系中构造函数的特点: /// 1.首先会调用父类的构造函数(默认的构造函数也就是没有参数的构造函数), ///   然后才会调用子类自身的构造函数 /// 2.如果父类重写了带有参数的构造函数后,在实例化子类对象的时候会出现编译 ///   错误.原因是重写了父类构造函数之后,系统不会在再父类自动生成默认的 ///   构造函数.而我们继承关系的构造函数特点是1 /// 3.子类的构造函数是可以指定,其在调用父类构造函数的时候去调用哪个父类构造函数 ///   写法,在构造函数后添加:base()即可.这里需要注意如果指定的父类构造函数带有两个参数 ///   那么base(a,b),以此类推.指定构造函数调用要遵循实参->形参的原则,就是类型相对应           this 与base关键字: this可以访问当前类中定义的字段属性方法,有没有this都可以访问,有this可以让IDE-VS编译器给出提示,另外当方法的参数与字段重名的时候,使用this可以表明访问的是类中的字段,base可以调用父类*有的方法和字段,有没有base都可以访问,但是有base的话,IDE编译器会给出提示,把所有可以调用的字段和方法罗列出来方便选择