本帖最后由 武汉分校-小舞 于 2016-9-13 11:30 编辑
【趣味Java】面向对象五(上篇)
剧情回顾: 上一集说到了,继承。什么是继承,继承就是大类(父类),分为多个小类(子类),而这些个小类都具备一些相同的属性和方法,这些共同点都是来自于父类,那么这就继承的大思想。 然后还讲解了一子类可以直接调用父类公有的方法和属性,父类私有的方法和属性不能调用。 顺便给个彩蛋,如过点招的时候这么跟面试官总结继承,面试官肯定会很青睐于你的回答~~~~~ 本集剧情: 关于继承中子类父类的构造方法: 什么是继承中的构造?上一集提到了子类可以使用父类的共有的方法和属性?那么构造呢?构造方法也是方法啊,怎么使用呢?什么时候使用呢? 记得第一集中提到了一点么 需要一个健康完整的人类诞生要怎么办?? 需要一个全参数的构造方法,在方法里面做赋值操作,在创建对象的时候进行调用。 看下面代码第一集剧情回顾 这样我们就有一个完整的人类了是吧, 好那么我们现在写一个关于继承的人类的代码 子类继承父类,老生常谈了.......................... 下面我们来造人~~~嘿嘿嘿 我就问这科学么???怎么可能在诞生之后再决定性别和肤色???? 你么肯定会说:那就特么调用代参构造啊,你不是讲过么,不是在父类中写了代参构造么,用呗!! 好那么我们来试试: 报错了,看到没!!! 错误信息大概在说:对不起,没有这个构造方法(强行翻译一波~~~) 父类中不是有么??为什么不能用,不是说了只要不是私有就可以么?? 那么在这里告诉你,构造方法不能被继承!!!!! 那么怎么办? 我们来分析:刚才造人的代码看我红色圈圈的地方 这是在调用什么??废话当然是空参数的构造 你们肯定会问:这个空参数构造在哪呢? 明明什么都没有啊??? 之前课程中其实有学到,没有参数的构造方法是默认的,意思你不写系统也会帮你加上去 我们来看看系统默认的构造是怎么写的(默认还有个意思就必须有的!!) 默认的空参数构造你们都知道但是红色圈圈里面的是啥? super叫指向父类,跟this关键字有点类似,this是指向本类, Super可以访问父类的成员(方法,属性) 那么super();是叫调用父类构造,那么调用的是什么构造呢? 问:括号里面有参数么? 你们回答:没有 对的很棒,既然没有参数,肯定是调用的是空参数的构造, 那么问题来了,如何造一个健康的人??? 问:造健康的人的逻辑在哪里?? 你们回答:在父类的全参数构造里面啊 对头,那么怎么解决???既然有这个方法,那么我们直接用就可以啊!! 怎么用,既然是父类的构造,那么我们是不是可以通过super调用 (这一波的分析堪称完美,哈哈哈~~~·) 上面框框里面的参数哪里来? 你们回答:废话肯定是传进来啊 例如: 上面的代码写的很清楚,需要参数需要从外面传进来,那么既然是传参肯定需要变量接收数据,赋值符号=左边的就是参数列表, 完整代码: 这些代码写完之后就可以造一个健康的人了: 需要同学们思考的一些小问题: 如果在类中没有空参数构造 如下代码 那么我们子类还这样写,看下面代码 会出现什么问题呢? 整个测试类,测试下看看 再一次报错 此时的你们:不是说好了空参数是默认的么???怎么还是说找不到这个构造方法??? 对的空参数构造是默认的但是你们忘记了一点: 上面圈圈的地方是在干嘛?上面讲了的是在调用父类空参,而且是默认的也就是必须有, 那么你的父类有空参数么??? 你们回答:没有!! 是吧,没有,那肯定报错啊,你调用子类的空参数构造的同时,默认也是必须访问父类的空参数构造!!!一定要记住!! 而且当你自己写了代参构造忘记写空参构造的时候,那么系统默认就被你写的覆盖掉了, 一定要加上,要不就会报错!!! 在来一个需要注意的点:看下面代码 上面代码在super的上面写了句话然后运行 又错了,实力翻译一波:意思是super();必须在第一行,代码的第一行上面不能有任何东西, 也就是说,这个构造方法一调用,首先必须访问父类的构造 正确代码: 结果: 本集的主要知识点: 关于如何访问父类的构造 Super关键字 Super();必须在构造方法中代码的第一行 Super()是继承的关键所在,因为每次创建子类的对象的时候,调用子类构造,肯定会先访问父类的构造。 好了上面说了这么多,继承的体现其实不光是extends关键字,最大体现其实在于这个 super()必须调用父类构造。有了这两个东西才叫继承。 |