A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 常佳杰 中级黑马   /  2012-6-18 14:46  /  1585 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class BaseClass {
BaseClass() {
  method();
}
public void method() {
  System.out.println("BaseClass的方法");
}
}
class SupClass extends BaseClass
{
        private String str = "supClass";
        public void method()
        {        
                //super(); 下面代码是用匿名内部类实现对method的重写,也就是用的是父类的方法,但是方法体是子类的
                new BaseClass()
                        {
                                public void method()
                                {
                                        System.out.println("SupClass.method()");
                                        System.out.println(str);//如果这样写的话,这里就有个问题出现了,str是什么时候被初始化成null的,父类是不存在str的引用
                                }
                        }.method();        
        }
}红色字体部分的详细解释?

3 个回复

倒序浏览
匿名内部类访问局部变量必须要用final修饰
回复 使用道具 举报
当SupClass (子类)进入内存就默认初始化了,也就是null。
回复 使用道具 举报
如果LZ是在测试类中创建了SupClass的对象,SupClass s=new SupClass(),str结果肯定是null,
因为在创建对象时子类的对象先会调用父类的构造方法,如果子类没有,会在子类中默认加个个BaseClass() {super();}。
super()就是在指向父类的构造方法,因为有重写,所以不会执行父类中的method()方法,执行的是子类中的。
现在答案出来了,因为直接调用了method()方法,它的属性 str 只是被默认初始化为null,还没有被初始化完毕,所以结果才为null。

LZ明白了吧。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马