黑马程序员技术交流社区

标题: 关于初始化顺序的小程序 [打印本页]

作者: 郑强强    时间: 2012-4-10 09:01
标题: 关于初始化顺序的小程序
    class Parent{
          int x=10;
          public Parent(){
               add(2);
          }
          void add(int y){
               x+=y;
          }
     }

     class Child extends Parent{
          int x=9;
          void add(int y){
               x+=y;
          }
          public static void main(String[] args){
               Parent p=new Child();
               System.out.println(p.x);
          }  
     }
     问输出结果是什么?


作者: 姜志钦    时间: 2012-4-10 09:08
标题: ;
本帖最后由 姜志钦 于 2012-4-10 09:13 编辑

输出结果:10;
声明父类,创建子类对象,子类对象拥有父类的属性和方法,你输出只是调用对象的属性,声明的是父类,调用不到子类的属性和方法,要调用子类的属性和方法必须进行向下转型。所以输出的是父类的属性X=10.
作者: 黄或俊    时间: 2012-4-10 09:24
继承中初始化次序:
初始化父类的静态代码
初始化子类的静态代码
初始化父类的非静态代码
初始化父类构造函数
初始化子类非静态代码
初始化子类构造函数
【成员变量在多态调用时,无论编译和运行都参考左边(引用型变量所属的类)——static方法也是这样】
作者: 贠(yun)靖    时间: 2012-4-10 11:22
姜志钦 发表于 2012-4-10 09:08
输出结果:10;
声明父类,创建子类对象,子类对象拥有父类的属性和方法,你输出只是调用对象的属性,声明的 ...

class Parent{
          int x=10;
          public Parent(){
               add(2);
          }
          void add(int y){
                          System.out.println("Parent");
               x+=y;
          }
     }

     class Child extends Parent{
          int x=9;
          void add(int y){
                            System.out.println("Child");
               x+=y;
          }
          public static void main(String[] args){
               Parent p=new Child();
               System.out.println(p.x);
          }  
     }
子类覆盖了 父类的方法  其实调用的是子类覆盖后的方法
  加了两句话   输出Child    其他的说法都没问题
作者: 郑强强    时间: 2012-4-10 15:45
姜志钦 发表于 2012-4-10 09:08
输出结果:10;
声明父类,创建子类对象,子类对象拥有父类的属性和方法,你输出只是调用对象的属性,声明的 ...

谢谢啦!有些许明白了
作者: 程旦    时间: 2012-4-10 18:14
贠(yun)靖 发表于 2012-4-10 11:22
class Parent{
          int x=10;
          public Parent(){

class Parent{
     int x=10;
     public Parent(){
          add(2);
     }
     void add(int y){
                     System.out.println("Parent");
          x+=y;
     }
}

class Child extends Parent{
     int x=9;
     void add(int y){
          System.out.println("Child");
          System.out.println("xxxx="+x);//我在这儿加了一行  为什么输出的是 xxxx=0呢
          x+=y;
     }
     public static void main(String[] args){
          Parent p=new Child();
          System.out.println(p.x);
     }  
}
  System.out.println("xxxx="+x);//我在这儿加了一行  为什么输出的是 xxxx=0呢???
有点儿不明白
作者: 贠(yun)靖    时间: 2012-4-10 18:23
程旦 发表于 2012-4-10 18:14
class Parent{
     int x=10;
     public Parent(){

调用子类的方法  而子类的方法中的x 使用的是  子类中的x  这时候 子类中的x还没有给他赋值
  是隐士赋值的  即默认赋值  所以就是0了   等子类构造方法中的super执行完  也就是调用父类的构造方法  那些代码执行完 才开始给子类中的x初始化的




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