子类默认构造函数调用父类的无参构造函数
默认构造函数初始化类中声明的实例变量
哪个对?我针对这2句话写了2个小例子,怎么感觉都对?class Farther {
    int a;
    Farther(){
     a=1;
    }    
}class Son extends Farther{

}public class Test{
public static void main(String args[]) {
     Son son=new Son();
     System.out.println(son.a);
    }
}
输出1class Test2 {
    int a;    
}public class Test{
public static void main(String args[]) {
     Test2 t=new Test2();
     System.out.println(t.a);
    }
}
输出0

解决方案 »

  1.   

    第一个调用了父类构造函数
    第二个没有给int成员赋值的话默认是0
      

  2.   

    我觉的应该是第二个错误.class Farther { 
        int a; 
        Farther(){ 
        }    
    } class Son extends Farther{ } public class Test2{ 
    public static void main(String args[]) { 
        Son son=new Son(); 
        System.out.println(son.a); 
        } 

    这里没有默认的构造函数吧,但它也会初始化成员变量
      

  3.   

    成员变量没有初始化的话,java会使用默认的初始化
    byte,short,int 默认0
    long 默认0L
    char  '\u0000'
    float 0.0f
    double 0.0d
    boolean false
    所有引用类型 null
    跟默认构造函数没关系吧
      

  4.   

    默认构造函数初始化类中声明的实例变量
    这句话是错的的,
    类中声明的实例变量是在类被构造时,被初始化的,如果没有给int a赋值,就会默认是0.然后,才会调用类的构造函数。
      

  5.   

    调用Test2成员变量,成员变量如果没有赋值,他有默认值的.
    第一个用构造函数给成员变量赋值,第2个虽然用到默认构造函数,但这构造函数里 没有对a重写赋值..
      

  6.   

    构造对象的时候,在任何其他事情发生前,将分配给对象的存储空间初始化为二进制0。
    再看余下的问题
    public class Test {
    int i = 3;
    int j = 4;
    }
    看看它编译后的字节码(没做任何修改,javap -c Test):
    public class T extends java.lang.Object{
    int i;int j;public T();
      Code:
       0:   aload_0
       1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
       4:   aload_0
       5:   iconst_3
       6:   putfield        #2; //Field i:I
       9:   aload_0
       10:  iconst_4
       11:  putfield        #3; //Field j:I
       14:  return}
    在源码上给i,j赋值了,看看第2,3行是不是和你想像的有点不一样了。实际上在构造函数的第6,11行才真正使i, j 的值变为3, 4。至于“子类默认构造函数调用父类的无参构造函数”
    每个构造函数必须调用重载构造函数(this())或调用超类构造函数(super())作为其第一条语句。不显式调用,则编译器自动插入super()作为第一条语句;
    对super()的调用可以是无参数调用,也可以包含超类构造函数的参数。