黑马程序员技术交流社区

标题: 答题时遇到的一个不懂的知识点 [打印本页]

作者: 常佳杰    时间: 2012-6-18 14:47
标题: 答题时遇到的一个不懂的知识点
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();        
        }
}红色字体部分的详细解释?


作者: 唐辉辉    时间: 2012-6-18 15:13
本帖最后由 唐辉辉 于 2012-6-18 15:15 编辑

这个问题我也遇到过, 请高人解析
作者: 吴小东    时间: 2012-6-18 15:22
比如你创建一个类
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
作者: 车风波    时间: 2012-6-18 15:34
成员变量默认初始化是在类的文件进入内存后,显式初始化是在此类的构造函数执行完毕后, System.out.println(str);之前只是调用了父类的构造函数,并没有执行到子类的构造函数,所以str并没有显式初始化,所以为null。
作者: 胡卿    时间: 2012-6-18 15:36
是类部类把你弄晕了,如果你还原了就能看明白了,如下
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();     */   
        }
}





作者: 揭耀祖    时间: 2012-6-18 15:41
当你new BaseClass(){}时,这时自动调用父类BaseClass类的构造函数,而BaseClass的构造函数调用的又是method()函数,
你的匿名内部类中又复写了method()函数,所以调用的又是匿名内部类的method()函数,匿名内部类中的method()中的str
变量为子类SupClass的成员变量,但这个时候str还没有初始化呢,所以打印为null.




作者: 邓杰    时间: 2012-6-18 16:08
jxj4227982333 发表于 2012-6-18 15:41
当你new BaseClass(){}时,这时自动调用父类BaseClass类的构造函数,而BaseClass的构造函数调用的又是metho ...

很给力;十个字;
作者: 黑马-王言龙    时间: 2012-6-18 22:08
本帖最后由 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
复制代码

作者: 0416-孙磊    时间: 2015-5-1 21:26
高人指点一二
作者: 骷髅王子    时间: 2016-3-7 21:09
还在基础班,不过路过就进来学习一下




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