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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 常佳杰 中级黑马   /  2012-6-18 14:47  /  2732 人查看  /  9 人回复  /   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();        
        }
}红色字体部分的详细解释?

9 个回复

正序浏览
还在基础班,不过路过就进来学习一下
回复 使用道具 举报
高人指点一二
回复 使用道具 举报
本帖最后由 wyl530274554 于 2012-6-18 22:16 编辑
  1. /*
  2. 需求:
  3. 思路:
  4. */


  5. public class BaseClass {
  6.         BaseClass() {        //3、执行此构造函数
  7.                 method();        //4、new谁调谁原则,调用的是SupClass的method()
  8.         }
  9.         
  10.         public void method() {
  11.          System.out.println("BaseClass的方法");
  12.         }
  13.         
  14.         public static void main(String[] args) { //自己测试用加上的
  15.                 new SupClass(); //1、准备创建一个SupClass对象
  16.         }
  17. }
  18. class SupClass extends BaseClass
  19. {
  20.         //Supclass() {super(); } //2、执行默认构造函数初始化对象,要调用父类的空参数的构造方法
  21.         
  22.         private String str = "supClass";
  23.         public void method()        //5,执行此方法
  24.         {                        
  25.                 new BaseClass()        //6、创建匿名内部类对象
  26.                                 {
  27.                                         public void method()        //8、执行此方法,到此时还没有将"字符串池"里数据"supClass"的地址赋值给str,给这过程中的变量赋值是第最后一步要做的事。
  28.                                         {
  29.                                                 System.out.println("SupClass.method()");
  30.                                                 System.out.println(str);        //未指向"supClass",所以为null
  31.                                         }
  32.                                 }.method(); //7、调用匿名内部类的method方法   
  33.         }
  34. }


  35. 我现在还有一个问题,为什么执行结果会出现两次?
  36. SupClass.method()
  37. null
  38. SupClass.method()
  39. null
复制代码
回复 使用道具 举报
邓杰 中级黑马 2012-6-18 16:08:16
7#
jxj4227982333 发表于 2012-6-18 15:41
当你new BaseClass(){}时,这时自动调用父类BaseClass类的构造函数,而BaseClass的构造函数调用的又是metho ...

很给力;十个字;
回复 使用道具 举报
当你new BaseClass(){}时,这时自动调用父类BaseClass类的构造函数,而BaseClass的构造函数调用的又是method()函数,
你的匿名内部类中又复写了method()函数,所以调用的又是匿名内部类的method()函数,匿名内部类中的method()中的str
变量为子类SupClass的成员变量,但这个时候str还没有初始化呢,所以打印为null.



回复 使用道具 举报
是类部类把你弄晕了,如果你还原了就能看明白了,如下
class BaseClass {
BaseClass() {
  method();
  {
  }
  
  method();
  class Inter
        {
        public void method()
         {
             System.out.println("SupClass.method()");
             System.out.println(str);//这里的str没有被定义,哪里来的值呢,所以改成你的那种写法自然就为String的默认值null了
         }
        }
}
public void method() {
  System.out.println("BaseClass的方法");
}
}
class SupClass extends BaseClass
{
        private String str = "supClass";
        public void method()
        {        
               
               /* new BaseClass()
                        {
                                public void method()
                                {
                                        System.out.println("SupClass.method()");
                                        System.out.println(str);
                                }
                        }.method();     */   
        }
}




回复 使用道具 举报
成员变量默认初始化是在类的文件进入内存后,显式初始化是在此类的构造函数执行完毕后, System.out.println(str);之前只是调用了父类的构造函数,并没有执行到子类的构造函数,所以str并没有显式初始化,所以为null。

评分

参与人数 1黑马币 +10 收起 理由
曾祥彬 + 10 默认初始化是在文件进入内存后,显示初始化.

查看全部评分

回复 使用道具 举报
比如你创建一个类
class demo()
{
     int a;//这个就相当于隐式初始化,系统会默认赋值为0
     int x = 1;
}

当 demo d= new demo();Java虚拟机会先找到demo类的demo.class字节码文件加载到内存,
当类的字节码被加载的时候static静态成员就会被初始化赋值,基本类型的数值型都会变成默认初始化值---->这里就是系统隐式初始化
字符串的隐式初始化的值为null  布尔型的为 false  int型的为 0

然后再是显示初始化,就是把相应的值赋值给相应的成员变量
int x = 1; 实际上是先让 int x = 0; 然后再把1赋值给x

评分

参与人数 2技术分 +1 黑马币 +10 收起 理由
职业规划-刘倩老师 + 1
唐辉辉 + 10 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 唐辉辉 于 2012-6-18 15:15 编辑

这个问题我也遇到过, 请高人解析
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马