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

来源:互联网 发布:手机记牌器软件 2016 编辑:程序博客网 时间:2024/05/01 05:33

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编译器会给出提示,把所有可以调用的字段和方法罗列出来方便选择


原创粉丝点击