黑马程序员技术交流社区

标题: 构造初始化问题? [打印本页]

作者: jagon    时间: 2014-3-17 10:34
标题: 构造初始化问题?
本帖最后由 jagon 于 2014-3-17 23:12 编辑

package test1;
abstract class A{
        public A(){
                this.print();
        }
        
        public abstract void print();
}

class B extends A {

        private int data=10;
        public B(int data) {
                this.data=data;
        }

        public void print(){
                System.out.println(data);
        }
}

public class demo1{
        public static void main(String[] args) {
                new B(100);
        }

        
}
为什么输出结果是0,不是应该是100吗?请帮忙解答,谢谢了!
作者: osully    时间: 2014-3-17 10:58
子类构造函数 第一行 有个默认的super();
父类在初始化的时候没有初始化到data,所以默认初始化是0

你写 new B(100).print(); 就可以看到100了  !!!
作者: 焚雨成灰    时间: 2014-3-17 11:03
执行的顺序是这样的:1.B中的data先初始化为0  2.再执行B的构造方法(注意B的构造方法省略super()),因此打印的是0
具体参考:http://blog.csdn.net/macheng365/article/details/6403050
作者: daoyua    时间: 2014-3-17 11:26
虽然回答你问题,但是我也学到不少,构造函数有个父类的super()是空参数的,调用的print是父类的,父类的print里面什么都没有,所以打印出0
作者: 1014917278    时间: 2014-3-17 20:23
你的子类里面并没有调用过print()方法,并且子类在初始化时,调用构造函数,默认先加载父类的构造函数。
这样就行了。亲
  1. package test1;
  2. abstract class A{
  3.         public A(){
  4.                 this.print();
  5.         }
  6.         
  7.         public abstract void print();
  8. }

  9. class B extends A {

  10.         private int data=10;
  11.         public B(int data) {
  12.                 this.data=data;
  13.                 print();
  14.         }

  15.         public void print(){
  16.                 System.out.println(data);
  17.         }
  18. }

  19. public class demo1{
  20.         public static void main(String[] args) {
  21.                 new B(100);
  22.         }

  23.         
  24. }
复制代码

作者: chaos    时间: 2014-3-17 21:52
new B(100) 调用b的构造函数,b的构造函数中有super()调用a的构造函数
过程中虽然传递了100但是没有调用b的print()所以没有输出100
作者: 刘一博    时间: 2014-3-17 22:16
本帖最后由 刘一博 于 2014-3-17 22:25 编辑

main方法中new B(100);
首先调用B的带参构造器
  1. public B(int data) {
  2.                 super(); //当子类初始化时,默认调用父类无参构造器,代码中可省略,但默认调用这一方法
复制代码
父类无参构造函数中调用了print方法,由于子类重写了该方法,实际调用了子类的print方法,此时需注意类加载的顺序,构造函数在非静态成员变量的前面,则此时data还为0,则打印0
当赋值后再次调用print方法,此时输出100
输出结果为0,100

作者: zms2100    时间: 2014-3-17 22:40
  1. abstract class A{
  2.     public A(){
  3.             this.print();
  4.     }
  5.     public abstract void print();
  6. }

  7. class B extends A {
  8.     private int data=10;    /*如果改为private static int data=10;可以明显清楚是在执行this.data = data;前执行super();时data值初始化值0,而定义为static随类加载而加载也就初始化值为10;*/
  9.     public B(int data) {
  10.             //super();       出现0,因为此处先初始化父类构造函数,执行时下面赋值语句未执行。
  11.             this.data=data;
  12.     }

  13.         public void print(){
  14.             System.out.println(data+"  hehe");
  15.     }
  16. }

  17. public class demo1{
  18.     public static void main(String[] args) {
  19.             new B(100);
  20.     }   
  21. }
复制代码

LS们基本都说到点上了,LZ理解后可以自行想合适的方式修改。




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