- 先说一下普通对象的构造过程
比如下面
public class Hello{
int i=0;
public static void main(String[] argv){
Hello obj1=new Hello();
}
}
(1)初始化Objec的静态变量,然后调用Objec的静态初始化块
(2)初始化Hello的静态变量,然后调用Hello的静态初始化块
(3)初始化Object的实例变量,和实例代码。
(4)调用Object的无参构造函数
(5)初始化Hello的实例变量,和实例代码。
(6)调用Hello的无参构造函数
具有显性继承的对象
public class Fther{
}
public class Son extends Father{
public static void main(String[] argv){
new Son();
}
}
(1)初始化父类Father的静态变量,然后调用父类Father的静态初始化块
(2)初始化子类Son的静态变量,然后调用子类Son的静态初始化块
(3)初始化父类Fahter的实例变量,和实例代码。
(4)调用父类Father的无参构造函数
(5)初始化子类Son的实例变量,和实例代码。
(6)调用子类Son的无参构造函数
但是我这里强调一些规则。
对于子类,如果没有构造函数,则会调用默认的无参构造函数,默认的无参构造函数会调用父类的无参构造函数如果父类没有构造函数,则会调用默认无参构造函数,如果父类没有提供无参构造函数,则编译不会通过,提示需要给父类提供无参构造函数
对于子类,如果有构造函数,构造函数中并没有声明调用父类的构造函数,则会调用父类的无参构造函数,其余同上。
如果子类显示的调用了父类的有参构造函数,则不会调用父类的无参构造函数
public class Father{
public Father(int n){
System.out.println("父类有参构造函数");
}
}
public class Son extends Father{
public static void main(String[] argv){
new Son();
}
}
public class Father{
public Father(){
System.out.println("父类无参构造函数");
}
public Father(int n){
System.out.println("父类有参构造函数");
}
}
public class Son extends Father{
public static void main(String[] argv){
new Son();
}
}
public class Father{
public Father(){
System.out.println("父类无参构造函数");
}
public Father(int n){
System.out.println("父类有参构造函数");
}
}
public class Son extends Father{
public Son(){
}
public static void main(String[] argv){
new Son();
}
}