- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
如何创建对象实例 对象实例何时被创建,这个问题也许你用一句话就能回答完了。但是它的潜在陷阱却常常被人忽视,这个问题也许并不像你想的那么简单,不信请你耐心看下去。 我前几天问一个同学,是不是在调用构造函数后,对象才被实例化?他不假思索的回答说是。 请看下面代码: Java代码 1. Date date=new Date(); 2. 3. em.out.println(date.getTime()); 新手在刚接触构造函数这个概念的时候。他们常常得出这样的结论:对象实例是在调用构造函数后创建的。因为调用构造函数后,调用引用(date)的实例方法便不会报NullPointerException的错误了。 二、经验者的观点 然而,稍稍有经验的Java程序员便会发现上面的解释并不正确。这点从构造函数中我们可以调用this关键字可以看出。 请看下面代码: Java代码 1. public class Test 2. 3. { 4. 5. public Test() 6. 7. { 8. 9. this.DoSomething(); 10. 11. } 12. 13. 14. 15. private void DoSomething() 16. 17. { 18. 19. System.out.println(do init); 20. 21. } 22. 23. } 这段代码中我们在构造函数中已经可以操作对象实例。这也就证明了构造函数其实只是用于初始化,早在进入构造函数之前。对象实例便已经被创建了。 三、父类构造函数 当创建一个有父类的子类的时候。对象的实例又是何时被创建的呢?我们也许接触过下面经典的代码: Java代码 1. public class BaseClass 2. { 3. public BaseClass() 4. { 5. System.out.println(create base); 6. } 7. } 8. public class SubClass 9. { 10. public SubClass() 11. { 12. System.out.println(create sub); 13. } 14. public static void main(String[] args) 15. { 16. new SubClass(); 17. } 18. } 结 果是先输出create base,后输出create sub。这个结果看起来和现实世界完全一致,先有老爸,再有儿子。因此我相信有很多程序员跟我一样会认为new SubClass()的过程是:实例化BaseClass-调用BaseClass构造函数初始化-实例化SubClass-调 用SubClass构造函数初始化。然而非常不幸的是,这是个错误的观点。 四、奇怪的代码 以下代码是为了驳斥上面提到的错误观点。但是这种代码其实在工作中甚少出现。 Java代码 1. public class BaseClass 2. { 3. public BaseClass() 4. 5. { 6. 7. System.out.println(create base); 8. 9. init(); 10. 11. } 12. protected void init() { 13. 14. System.out.println(do init); 15. } 16. } 17. 18. // 19. 20. public class SubClass 21. { 22. public SubClass() 23. { 24. 25. System.out.println(create sub); 26. 27. } 28. @Override 29. 30. protected void init() 31. 32. { 33. 34. assert this!=null; 35. 36. System.out.println(now the working class is:+this.getClass().getSimpleName()); 37. 38. System.out.println(in SubClass); 39. 40. } 41. 42. public static void main(String[] args) 43. 44. { 45. 46. new SubClass(); 47. 48. } 49. 50. } 这段代码运行的结果是先调用父类的构造函数,再调用子类的init()方法,再调用子类的构造函数。 这是一段奇妙的代码,子类的构造函数居然不是子类第一个被执行的方法。我们早已习惯于通过super方便的调用父类的方法,但是好像从没这样尝试从父类调
文档评论(0)