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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑强强 中级黑马   /  2012-4-10 09:01  /  2146 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

    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);
          }  
     }
     问输出结果是什么?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

6 个回复

正序浏览
程旦 发表于 2012-4-10 18:14
class Parent{
     int x=10;
     public Parent(){

调用子类的方法  而子类的方法中的x 使用的是  子类中的x  这时候 子类中的x还没有给他赋值
  是隐士赋值的  即默认赋值  所以就是0了   等子类构造方法中的super执行完  也就是调用父类的构造方法  那些代码执行完 才开始给子类中的x初始化的
回复 使用道具 举报
贠(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呢???
有点儿不明白
回复 使用道具 举报
姜志钦 发表于 2012-4-10 09:08
输出结果:10;
声明父类,创建子类对象,子类对象拥有父类的属性和方法,你输出只是调用对象的属性,声明的 ...

谢谢啦!有些许明白了
回复 使用道具 举报
姜志钦 发表于 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    其他的说法都没问题
回复 使用道具 举报
继承中初始化次序:
初始化父类的静态代码
初始化子类的静态代码
初始化父类的非静态代码
初始化父类构造函数
初始化子类非静态代码
初始化子类构造函数
【成员变量在多态调用时,无论编译和运行都参考左边(引用型变量所属的类)——static方法也是这样】
回复 使用道具 举报

;

本帖最后由 姜志钦 于 2012-4-10 09:13 编辑

输出结果:10;
声明父类,创建子类对象,子类对象拥有父类的属性和方法,你输出只是调用对象的属性,声明的是父类,调用不到子类的属性和方法,要调用子类的属性和方法必须进行向下转型。所以输出的是父类的属性X=10.

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马