黑马程序员 面向对象--->继承

来源:互联网 发布:js实现一键关注公众号 编辑:程序博客网 时间:2024/04/30 00:43

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------...

继承是面向对象的三大特点之一.什么是继承呢?继承就是在多个类,里面包含了相同属性和方法的时候,那么我们把这些相同的数据提取出来放到一个类里面,让其他类在继承这个类那么出现继承有什么好处呢?1,继承的出现大大的提高了代码的复用性.2,继承的出现让类与类之间有了关系,为多态做铺垫.继承的特点1,Java只支持单继承2,Java采用多实现的方式来支持多继承。3,可以使用多层继承继承子类中关键字[1]. this代表本类对象的引用[2]. super代表父类对象的引用子类重写 (覆盖) 父类中方法何时应用重写[1]. 当子类继承了父类,这样子类就具备了父类的所有非私有的功能(方法)[2]. 当子类同样具备和父类相同功能的函数,但是功能的实现却和父类中该功能的实现不一样的时候这时候,没有必要在子类中定义新的功能而是重写这个功能的实现保留父类的功能定义(函数名),并重写功能的内容重写的条件[1].重写产生的时机:当满足子类中的函数的名字参数列表和父类的某个非私有功能具有相同的函数名字、参数列表的时候,Java的编译器就会把子类这个同名同参数的功能作为父类对应功能的重写。为了保证重写的正确性(也就是Javac编译通过),还要满足以下两个条件:(所以,是否为重写,最大原则就是父类的该方法是非private的访问权限!!!)[2]. 正确重写的条件1:重写的两个方法的其余部分满足以下条件:       {1}.返回值类型一致、{2}. 子类访问权限修饰符 >=父类的访问权限修饰符 (子类和父类中对应的方法都不能出现private!!!)         {3}. 子类函数抛出的异常类型必须是父类函数抛出来的异常类型的子类或者子集【注意】子类中的静态方法只能覆盖父类中的静态方法 ====>静态只能覆盖静态(3). 重写跟重载的区别[1]. 重载:只看是否是       相同的函数名和不相同的参数列表 (javac认定此时为重载)                     其余部分无所谓是否一致。[2]. 重写:只看子类、父类中是否是相同的函数名和参数列表(javac认定此时为重写)子类对象的实例化过程. 子类能覆盖父类的构造方法么子类不能覆盖父类的构造函数。原因:由于构造函数的名字是和类名是一样的。子类和父类类名又不相同,所以不满足子类父类之间的函数重载的充分条件,所以子类不能覆盖父类的构造函数。(2). 隐式的super语句和显式super语句[1]. 子类的构造函数中的第一行如果没有通过super语句显式调用父类构造函数的时候,JVM在执行的时候,会默认为子类的该构造函数的第一行加上代表空参数的父类构造函数的super语句: super()【结论】子类的构造方法的第一行默认是super()[2]. 由于子类的构造函数的第一行默认是super(),这要求父类的构造方法必须有相应的空参构造函数。如果父类没有相对应的空参构造函数,javac就会报错!!![3]. 当父类中没有空参构造函数的时候,子类的构造方法必须通过super(xxxx)语句指定要调用父类的哪一个构造函数来对自己进行初始化。 总结super语句【1】. 子类的所有构造函数都会默认访问父类空参的构造函数【2】. 父类没有空参数构造函数时,必须手动为子类构造函数指定要调用的父类构造函数。【3】. 当子类构造函数形成重载的情况时,如果某一个构造函数的第一行被this()语句占用,则这个子类的构造函数中必须保证至少有一个构造函数能够访问父类的构造函数。【问题】父类的构造函数中有super()语句么?有!这个super()语句是Object的默认空参构造函数 Object(){…..}3.    子类this的真实指向(盲点)1). 子类对象实例化过程 调用父类构造方法---- this的指向(1). 误区:认为实例化的过程中,调用父类的构造也同时实例化了父类实例【注意】子类通过自身构造方法实例化过程中再次调用父类的构造方法,实际上是通过父类的构造方法对父类的财产“成员变量”进行特有的初始化之后,再来继承父类的特有财产“成员变量”。【注意】绝对不是实例化子类对象之后,又同时实例化相应的父类对象!!!!

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------...

0 0