子类默认构造函数调用父类的无参构造函数
默认构造函数初始化类中声明的实例变量
哪个对?我针对这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
默认构造函数初始化类中声明的实例变量
哪个对?我针对这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
第二个没有给int成员赋值的话默认是0
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);
}
}
这里没有默认的构造函数吧,但它也会初始化成员变量
byte,short,int 默认0
long 默认0L
char '\u0000'
float 0.0f
double 0.0d
boolean false
所有引用类型 null
跟默认构造函数没关系吧
这句话是错的的,
类中声明的实例变量是在类被构造时,被初始化的,如果没有给int a赋值,就会默认是0.然后,才会调用类的构造函数。
第一个用构造函数给成员变量赋值,第2个虽然用到默认构造函数,但这构造函数里 没有对a重写赋值..
再看余下的问题
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()的调用可以是无参数调用,也可以包含超类构造函数的参数。