大数据JAVA基础第十一天

1.继承中构造方法的关系

1.子类中所有的构造方法默认都会访问父类中空参数的构造方法,除非显式使用super/this调用了父类或者是本类的其他构造方法。

2.在类中对本类或者是父类构造方法的调用,只能是在构造方法中,不能在实例方法中调用构造方法(更不能在类方法中调用构造方法),原因:

  • 实例方法被调用时,说明实例对象已经被创建完了,此时不能再使用this/super去初始化本实例或者是父类实例
  • 类方法是在本类加载的时候就已经加载的,这时实例对象还没有被创建出来,是不能使用this或者super的

2.

因为子类会继承父类中的数据(成员变量),可能还会使用父类的数据。

所以,子类初始化之前,一定要先完成父类数据的初始化。

换句话说,一个对象的创建意味着它的所有的父类都会被创建出来。

3.子类构造方法的第一条语句:

如果是this(...)表明调用的是本类的另一个构造方法,在另一个构造方法中还可以继续使用this(...)调用本类其他的构造方法,如果有多个构造方法的话,可以继续调用下去,但是不能递归调用,最终总会有一个构造方法,第一条语句不是this()了。

这时,可以显式的调用父类的构造方法super(...);或者什么都不写,这时系统默认调用父类的空参构造方法。

总之,当子类对象被创建的时候,总是会先调用父类的构造方法,直到Object这个最上层的对象被创建出来之后,其下的子类对象才会被创建出来。

4.考察父类,子类代码块的执行顺序

从这个案例中能看到有继承关系的类的实例初始化的过程,以及为什么在类方法中不能使用this或者是super关键字

5.如果父类中没有空参构造方法,怎么办?

1.子类可以通过super去显式调用父类其他的带参的构造方法

2.子类可以通过this去调用本类的其他构造方法,但是本类其他构造也必须首先用super(...)访问了父类的带参构造(因为父类没有空参构造)

6.总结

如果父类没有空参构造,子类的构造方法中就必须显式调用父类带参构造super(...);

一定要注意:

super(…)或者this(…)必须出现在构造方法第一条语句上

否则,就会有父类数据的多次初始化

7.如果父类没有无参构造方法,那么子类的构造方法会出现什么现象呢?

       报错。

    如何解决呢?

       A:在父类中加一个无参构造方法

       B:通过使用super关键字去显示的调用父类的其他带参构造方法

       C:子类通过this去调用本类的其他构造方法

       子类中一定要有一个去访问了父类的构造方法,否则父类数据就没有初始化。

    注意事项:

       this(...)或者super(...)必须出现在第一条语句上。

       如果不是放在第一条语句上,就可能对父类的数据进行了多次初始化,所以必须放在第一条语句上。

8.继承中成员方法的关系

子父类中存在同名和不同名的成员方法

结论

通过子类对象去访问一个实例方法

首先在子类中找(是否子类进行了重写,或者是子类特有的方法)

然后在父类中找(子类没重写,而是从父类继承而来的)

9.继承中成员方法的关系:

       A:子类中的方法和父类中的方法声明不一样,这个太简单。

       B:子类中的方法和父类中的方法声明一样,这个该怎么?

           通过子类对象调用方法:

              a:先找子类中,看有没有这个方法,有就使用

              b:再看父类中,有没有这个方法,有就使用

              c:如果没有就报错。

 

10.方法重写概述

方法重写概述

  • 子类中出现了和父类中一模一样的方法声明

称为方法覆盖Override/重写OverWrite

使用特点:

  • 如果方法名不同,就调用对应的方法
  • 如果方法名相同,最终使用的是子类自己的(使用子类的引用的时候,在多态情况下,使用父类的引用,则有可能调用的是父类的静态方法)

方法重写的应用:

  • 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。
  • 方法的重写是多态实现的条件

11.方法重写的注意事项

  • 父类中私有方法不能被重写,编译报错
  • 子类重写父类方法时,访问权限不能更低(后面讲),否则编译报错
  • 子类重写父类方法,返回值类型可以相同,或者是父类返回值类型的子类型
  • 父类的实例方法(非静态方法),子类不能重新定义为静态方法
  • 父类静态方法(类方法),子类也必须通过静态方法进行“重写”(虽然编译和使用都不报错,但其实这个算不上方法重写,但是现象确实如此,至于为什么算不上方法重写,多态中会讲解)
  • 子类中重写父类方法,按照重写的原则(访问权限不能变小,返回值同类或者子类,方法名相同,形参列表相同);否则子类中定义的同名方法就是方法的重载(继承而来的方法和子类定义的方法构成重载),重载就必须让参数列表不同。如果子类方法只与继承自父类的方法返回值不同,不能构成重载
  • 子类如果想重写父类的方法,最好是让方法的签名一模一样

 

(重写方法的一个重要用途就是:父类的引用能够指向子类的方法,但是静态方法的“重写”,在多态中依然调用的是父类的方法,所以,从这个角度上来讲,子类对父类的静态方法的重写不能算是真正方法的重写)

 

12.方法重写的注意事项

       A:父类中私有方法不能被重写

           因为父类私有方法子类根本就无法继承

       B:子类重写父类方法时,访问权限不能更低,最好就一致

       C:父类静态方法,子类也必须通过静态方法进行重写

           其实这个算不上方法重写,但是现象确实如此,至于为什么算不上方法重写,多态中讲解

子类重写父类方法的时候,最好声明一模一样。

    否则同名的方法就是方法的重载了,就必须让形参列表不同

posted on 2017-03-25 22:24  qq104233  阅读(151)  评论(0编辑  收藏  举报

导航