在编程的江湖上,总有这样一群人,他们赋有敏锐的嗅觉,能犀利地嗅出代码的bad smell.我们暂且称他们为“犀利哥”。有江湖的地方,总有犀利哥的传说。
昨日编程碰到一问题,苦苦鏖战2个时辰,没有结果。无奈之下请犀利哥出山,不到一根烟的功夫,问题解决,我第一次见识了犀利哥的魅力!
用一个demo来模拟我的问题,有3个类:
第一个:Cheese类:
class Cheese { }
第二个:Father类:
public class Father {
public Father() {
getCheese();
}
protected Cheese getCheese(){
return null;
}
}
public class Father {
public Father() {
getCheese();
}
protected Cheese getCheese(){
return null;
}
}
第三个:Son类:
public class Son extends Father{
private Cheese cheese=null;//-----1-----关键就在这!
//private Cheese cheese; //-----2-----
public Son() {
super();
// TODO Auto-generated constructor stub
}
public Cheese getCheese(){
if(cheese==null){
cheese=new Cheese();
}
return cheese;
}
public static void main(String[] args) {
Son son=new Son();
Cheese ch=son.getCheese();//-------3--------
System.out.println(ch.toString());
}
}
我们把Son类中的标注的1语句换成2语句,会发现在debug状态下,最后打印的Cheese对象的地址是不一样的。谁动了我的奶酪?原因何在?
原因分析:当是语句1时,它执行的逻辑是这样的:首先调用子类Son的构造器,然后调用父类Father的构造器,根据多态机制,在这个构造器里面调用子类的
getCheese()方法,得到一个Cheese对象。然后退出父类构造器,进而退出子类构造器,关键是下面接下来又执行了子类实例变量cheese的初始化,导致了Cheese对象又为null。
这样再执行3语句的时候,又new了一个新的Cheese对象。结果导致上面的结果。
当执行语句2时,执行的逻辑是:首先调用子类Son的构造器,然后调用父类Father的构造器,根据多态机制,在这个构造器里面调用子类的
getCheese()方法,得到一个Cheese对象。然后退出父类构造器,进而退出子类构造器,因为子类实例变量只是声明,没有初始化,所以执行语句3的时候,Cheese对象仍为原来的对象。
一点思考:为什么在运行环境下 地址却是一样的???
撰此小文,旨在提醒各位不要犯我这样的低级错误。
哦,最后忘记了介绍犀利哥啦,他就是集美貌与才华于一身的我们开发经理(名字就不说了)。
分享到:
相关推荐
这套课程既可以作为从零基础开始学习的JAVA基础到高级学习教程,对于有JAVA基础的同学来说可以略过前面的JAVA基础章节,直接学习后续的JAVA高级部分课程。更可以灵活的作为章节技术,进行针对性的JAVA学习。还是要...
java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础课件java基础...
市面上目前流传的java基础视频教程都是讲一些最基础的java语法和相关API的应用,然而用人单位对初级程序员的要求越来越高,那些讲解java基础语法的视频教程已经无法满足大众的学习要求。本套视频教程录制完中国第一...
Java基础 java学习笔记 Java Java基础Markdown学习笔记,可转换成PDF、Word等格式
Java基础入门教程 第5章 Java基础类的应用(共42页).ppt Java基础入门教程 第6章 集合框架(共28页).ppt Java基础入门教程 第7章 Java中的异常处理(共26页).ppt Java基础入门教程 第8章 文件流的输入输出操作...
资源名称:Java基础加强系列视频课程资源目录:【】黑马程序员Java基础加强(01-10)【】黑马程序员Java基础加强(11-20)【】黑马程序员Java基础加强(21-30)【】黑马程序员Java基础加强(31-40)【】黑马程序员...
《Java 基础入门》课后习题答案 第 第 1 章 Java 开发入门 一、填空题 1、 Java EE、Java SE、Java ME 2、 JRE 3、 javac 4、 bin 5、 path、classpath 二、选择题 1、ABCD 2、C 3、D 4、B 5、B 三、简答题 1、 面向...
Java基础加强Java基础加强Java基础加强
Java基础思维导图涵盖大部分Java基础重点内容。适用于新手小白理解Java学习之路。
\Java基础类\Java基础类\Java基础类\Java基础类\Java基础类\Java基础类\Java基础类\Java基础类\Java基础类\Java基础类
完整版精品java课件 Java基础入门教程 Java程序设计 第1章 Java语言概述(共38页).ppt 完整版精品java课件 Java基础入门教程 Java程序设计 第2章 java语言基础(共31页).ppt 完整版精品java课件 Java基础入门教程 ...
java基础开发第一册希望对你们有帮助,其他还有很多资料
Java基础入门.pdf
java基础知识的培训ppt,对于java初学者来说可以有一些作用。
java基础知识大全(必看经典),里面包含了最基本的java基础知识,适合学习java的初学者和想要复习java基础的同学。
Java基础入门教程 第5章 Java基础类的应用(共42页).ppt Java基础入门教程 第6章 集合框架(共28页).ppt Java基础入门教程 第7章 Java中的异常处理(共26页).ppt Java基础入门教程 第8章 文件流的输入输出操作...
Java 基础入门,适合初学入门java的同学
java基础的案例分析和实例教学,适合新手及回顾查阅,对于夯实基础有好处
Java 基础
java基础知识,帮助初学者更快更好地掌握java。ppt内容具体易懂,希望对刚接触java的初学者有所帮助。