黑马程序员技术交流社区

标题: 求问这代码的执行初始化问题,弄不明白! [打印本页]

作者: 聂益飞    时间: 2013-3-20 16:55
标题: 求问这代码的执行初始化问题,弄不明白!
本帖最后由 聂益飞 于 2013-3-20 20:38 编辑

class Collection_Test
{
        public static void main(String[] args)
        {
                Person         p=new Son_1("234");//1
                Son_1 son=new Son_1("234");//2
                System.out.println(p.get());//3
                System.out.println(p.name);//4
                System.out.println(son.get());//5
                                //如果输出的结果是null我就理解了,但是3,4,5结果均为
                //234,我理解的多态是,1中的name是从Person中继承过来的
                //子类并没有name,那p应该要向上转型才对,p.name就
                //跟p.get()是一个性质的,此时我操作的是子类继承过来的
                //name,父类的name并没有被赋值啊。还是说子类继承了name
                //后,并对其赋值,但终究操作的都是父类的name,求解。。。。。。。



                //此时输出的p.name是不是父类的name??(向上转型)



                Person p3=new Person();
                System.out.println(p3.name);
                //此时输出为123,不理解,
                //子类初始化顺序为
                //隐式初始化--显示初始化--代码块初始化--构造函数初始化
                //一层覆盖一层,最终执行到new Person()时,name="123"被
                //null覆盖才对啊。。。。。。。。求解。。。
        
        }
}

class Person
{
        String name="123";
        int age;
                Person(){}
        public String get()
        {
        return name;
        }
}

class Son_1 extends Person
{
        Son_1()
        {
          super();
        }
        Son_1(String name)
        {
                this.name=name;
        }
        
}

作者: 聂益飞    时间: 2013-3-20 18:13
  1. class Collection_Test
  2. {
  3.          public static void main(String[] args)
  4.          {
  5.                  Person         p=new Son_1("234");//1
  6.                  Son_1 son=new Son_1("234");//2
  7.                  System.out.println(p.get());//3
  8.                  System.out.println(p.name);//4
  9.                  System.out.println(son.get());//5
  10.                                  //如果输出的结果是null我就理解了,但是3,4,5结果均为
  11.                 //234,我理解的多态是,1中的name是从Person中继承过来的
  12.                 //子类并没有name,那p应该要向上转型才对,p.name就
  13.                 //跟p.get()是一个性质的,此时我操作的是子类继承过来的
  14.                 //name,父类的name并没有被赋值啊。还是说子类继承了name
  15.                  //后,并对其赋值,但终究操作的都是父类的name,求解。。。。。。。



  16.                 //此时输出的p.name是不是父类的name??(向上转型)



  17.                  Person p3=new Person();
  18.                  System.out.println(p3.name);
  19.                  //此时输出为123,不理解,
  20.                 //子类初始化顺序为
  21.                 //隐式初始化--显示初始化--代码块初始化--构造函数初始化
  22.                 //一层覆盖一层,最终执行到new Person()时,name="123"被
  23.                 //null覆盖才对啊。。。。。。。。求解。。。
  24.         
  25.          }
  26. }

  27. class Person
  28. {
  29.          String name="123";
  30.          int age;
  31.                  Person(){}
  32.          public String get()
  33.          {
  34.          return name;
  35.          }
  36. }

  37. class Son_1 extends Person
  38. {
  39.          Son_1()
  40.          {
  41.            super();
  42.          }
  43.          Son_1(String name)
  44.          {
  45.                  this.name=name;
  46.          }
  47.          
  48. }
复制代码
是这样子么?????????????
作者: michaelchen    时间: 2013-3-20 18:14
  1. class Collection_Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Person p=new Son_1("234");//1  父类引用指向子类对象,调用的是带参数的构造函数,p的成员变量name发生改变,由原来的123变成234
  6.                 Son_1 son=new Son_1("234");//2  调用的还是带参数的构造函数
  7.                 System.out.println(p.get());//3  p调用person类的get方法,其实传进去的实参就是234
  8.                 System.out.println(p.name);//4   p的成员变量name发生改变,由原来的123变成234
  9.                 System.out.println(son.get());//5 调用从person类继承来的get方法,返回的是构造函数里传入的参数
  10.                 Person p3=new Person();
  11.                 System.out.println(p3.name);//重新创建对象,直接返回成员变量的值
  12.                          }
  13. }

  14. class Person
  15. {
  16.         String name="123";
  17.         int age;
  18.         Person(){}
  19.         public String get()
  20.         {
  21.         return name;
  22.         }
  23. }

  24. class Son_1 extends Person
  25. {
  26.         Son_1()
  27.         {
  28.           super();
  29.         }
  30.         Son_1(String name)
  31.         {
  32.                 this.name=name;
  33.         }
  34.         
  35. }
复制代码
希望能帮到楼主




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