继承,方法重写,父类变量引用子类对象

继承:java继承是定义一种的新的类型,从已有的类中吸收
       成员变量和方法,新的类型可以添加新的方法和成员变量。
      这种方式可以提高代码的复用性,缩短开发周期,
      减少开发费用。
      现实世界中:通过分析多种类型,然后发现有一些共同特征和共同行为
                            再将这些种类,归纳为一种新类型
                            如:  黄色皮肤的人
                                      白色皮肤的人
                                      黑色皮肤的人
                     |
                                         人 
                                       
                            再如:    小狗 --能动,能吃,能睡,能叫(汪汪)
                                              小猫--能动,能吃,能睡,能叫(喵喵)
                        .......
                       |
                                          动物 
   计算机语言中:
               先编写父类类型,在编写子类型,然后再有对象。
               如:  先编写Animal类型
                         再编写 Dog类或Cat类型        继承父类的成员变量和方法 
                再使用数据时,要么创建Dog对象/Cat对象                                                          
                                                       
      子类可以父类中继承一些成员变量,和方法。子类还可以添加自己的
      独有成员变量和方法。
    能提高代码的复用性,提高开发效率,缩短开发周期
      子类:也叫派生类
      父类:也叫超类,基类   

关键字extends,用于继承语法
      格式:
      public class subClass extends SuperClass{
      
      }  
 
继承中的构造器:
         子类不能继承父类的构造器,但是,子类中的构造器可以调用
         父类的构造器
         语法: super(有参传参);
          作用:可以更好的给继承过来的成员变量赋值
         PS:子类中的构造器一定会有至少一个调用了父类的构造器(不一定
            都调用了,有可能this()调用了本类的构造器)。
              父类中如果没有无参构造器,子类需要显式调用父类构造器
              如果父类中有无参构造器,子类中的构造器可能隐式调用
              了父类的无参构造器.即:隐藏了super()
              
    super()与this()的区别
         相同点:都是调用构造器,而且必须放在首行首句。
     不同点:super()是调用父类的构造器
         this()是调用本类中其他构造器 

继承的传递性:
             继承特征有传递特性,B类型继承了A类型的特征,C类型继承了
             B类型的特征。C类型也间接继承了A类型的特征
继承的另外一特点:
            单继承: 一个子类只能继承一个父类。但是一个父类可以有
                          多个子类       
      java1.8版本以上支持多继承

   一个源文件中,只能有一个public修饰的类,而且此类必须与文件名一致。
  其他类可以不用修饰词
  main也需要在public修饰的类中,才能生效。
】   
==============================================================
方法的重写(override)
        子类可以继承父类的方法,在继承时,我们可以在子类中
         编写与父类中的方法名相同,参数列表也相同的方法。这就是
        重写。
      
    (1)父子类关系,方法名相同,参数列表相同
    (2)返回值类型可以相同,也可以不同[
            子类方法的返回值类型必须是父类方法的返回值类型的子类]  

方法的重载(overload)与重写(override)

概念:
     重载:  在同一个类中,方法名相同,参数列表不同
     重写:    子类重写父类的方法,方法名相同,参数列表相同
                 返回值类型可以相同,也可以是父类方法的返回值类型的子类
                  修饰词可以相同,或者权限比父类方法的权限大  

==============================================================
父类型的变量可以引用子类型的对象
    如:
      Animal   a = new GoldFish();
      Animal类型的变量a引用了子类型GoldFish的对象   
      符合人类的思维:
                    这条金鱼是动物    

      变量能调用的方法与成员变量
         方法:
                  编译期: 变量只能调用出本类型(父类)中的方法
                  运行期: 变量调用出方法执行逻辑与对象(子类)的类型有关
          成员变量:
                  变量调用出的成员变量一定是本类型中的成员变量
                如:Person p = new Student();
          p.name------>super.name
          p.age ------>super.age
          //p.score---->编译错误,p类型中没有成员变量score   
           
编译期绑定:
    在编译过程中,变量只能调出本类型中的方法(和成员变量)
     在编译期间,  方法静态绑定到变量上
运行期绑定
    在运行过程中,真正执行的方法的逻辑与对象的类型有关系。
    简单说成:方法在运行期间,动态绑定到对象上。
    
    
成员变量的调用与变量的类型有关系(与编译期和运行期无关)     
     
                     

【在创建子类对象时,在内存中会不会产生父类对象??】
【答案1: 会产生,没有父类对象,哪来的子类对象】
【答案2: 不会产生,创建子类对象时,子类对象的成员变量包含两部分:
       一部分为从父类中继承过来的
               在成员变量前有默认的super.
       一部分是自己本类中的
               在成员变量前有默认的this.
               
        如果子类中独有的与继承过来的成员变量重名时,必须
        显式指定使用super.或者是this.
        如果子类中没有与继承过来的成员变量相同名时,我们可以
        隐式不写,或者使用super.与this.其中任意一个。         
        
         为了避免不必要的麻烦,子类的成员变量尽可能不要与父类的
         成员变量同名       
】   

猜你喜欢

转载自blog.csdn.net/qq_42397691/article/details/81432397