黑马程序员技术交流社区

标题: 构造代码块的重写问题 [打印本页]

作者: 应文    时间: 2012-7-18 18:23
标题: 构造代码块的重写问题
本帖最后由 应文 于 2012-7-20 00:35 编辑

看完毕老师关于重写知识点的视频,重写的使用条件:
1.发生方法重写的两个方法返回值、方法名、参数列表必须完全一致。
2.子类方法的访问级别不能低于父类相应方法的访问级别。
3.静态只能覆盖静态。
我进行了测试:
  1. class ExtendsTest1
  2. {
  3. {
  4. System.out.println("word_piece fu");
  5. }

  6. ExtendsTest1()
  7. {
  8. System.out.println("construction1");
  9. }

  10. void print()
  11. {
  12. System.out.println("function fu");
  13. }
  14. }

  15. class ExtendsTest2 extends ExtendsTest1
  16. {

  17. {
  18. System.out.println("word_piece zi");
  19. }

  20. ExtendsTest2()
  21. {
  22. System.out.println("construction2");
  23. }

  24. void print()
  25. {
  26. System.out.println("function zi");
  27. }
  28. }


  29. class DemoTest
  30. {
  31. public static void main(String[] args)
  32. {
  33. ExtendsTest2 object = new ExtendsTest2();
  34. object.print();
  35. }
  36. }
复制代码
运行结果是:
word_piece fu
construction1
word_piece zi
construction2
function zi

老师说了构造函数是肯定不会重写的,因为方法名不同,请问上面代码,子类中构造代码块与父类中构造代码看起来好像满足重写的三个条件,那为什么不被重写呢?如果不能被重写,那是不是有不同的隐性代码,请问为什么?

作者: 张_涛    时间: 2012-7-18 19:30
两个不同的类的构造方法的名字一样么?
能变成一样么?
所以,不可以重写了。
作者: 应文    时间: 2012-7-18 19:32
本帖最后由 应文 于 2012-7-18 19:36 编辑

我知道,构造函数是不可以重写的,我想问的是,构造代码块为什么不能重写?
构造函数的名称是不一样,是不可以重写,那么,构造代码块哪不一样呢?有什么隐性代码吗?
作者: 杨政    时间: 2012-7-18 20:24
个人理解吧,构造代码块它就不是函数!因为子类可以直接获取父类数据,那么建立子类对象时,那么的先知道父类是怎么对这些数据进行初始化的吧。父类的构造代码块就是干这事的,它先于子类构造代码块执行了,拿还谈什么覆盖啊。
ExtendsTest2 object = new ExtendsTest2(); 建立子类对象,要先访问父类的初始化部分吧,所以是先执行父类构造代码块、构造函数,然后才是子类初始化部分构造代码块、构造函数!
object.print(); 执行覆盖后的子类方法吧。
0基础菜鸟,看了几天视频,汗颜汗颜!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2