1:构造器是干什么的???
构造器最大的用处就是在创建对象时执行初始化,当创建一个对象时,系统会为这个对象的实例进行默认的初始化。如果想改变这种默认的初始化,就可以通过自定义构造器来实现。
2:使用构造器时需要记住:
1.构造器必须与类同名(如果一个源文件中有多个类,那么构造器必须与公共类同名)
2.每个类可以有一个以上的构造器;
3.构造器可以有0个、1个或1个以上的参数;
4.构造器没有返回值;
5.构造器总是伴随着new操作一起调用;
3:构造器的调用:
调用无参的构造器:如
我们先创建一个Father类,体提供一个无参的构造器,
1 package Constructor; 2 3 public class Father { 4 5 public Father() { 6 System.out.println("调用了这个构造器"); 7 } 8 }
然后我们去创建测试类,去new这个对象
1 package Constructor; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 Father F1=new Father(); 8 9 } 10 }
我们直接运行,会发现构造器被调用了
到我们信new一个对象的时候,这个时候就会默认调用空的构造函数,然后初始化这个对象,其实new一个对象就是在堆中给开辟了一个新的内存空间,里面存放的是这个对象的信息,然后栈中存放的是句柄,这个句柄对应着堆中对象所在的位置。
如果我们自定义了构造函数了,则调用的时候就不会自动调用无参的构造函数了,如:
调用有参的构造器:如
1 package Constructor; 2 3 public class Father { 4 private String name; 5 private int age; 6 private String sex; 7 8 9 public Father(String name, int age, String sex) { 10 super(); 11 this.name = name; 12 this.age = age; 13 this.sex = sex; 14 System.out.println("调用了有三个参数的构造函数"+name+"--"+age+"--"+sex); 15 } 16 17 18 public Father(String name, int age) { 19 super(); 20 this.name = name; 21 this.age = age; 22 System.out.println("调用了有三个参数的构造函数"+name+"--"+age); 23 } 24 25 26 27 public Father(String name) { 28 super(); 29 this.name = name; 30 System.out.println("调用了有三个参数的构造函数"+name); 31 } 32 33 34 }
在这里我们可以看到我们重载的构造的方法,
1 package Constructor; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 Father F1=new Father("GH"); 8 9 Father F2=new Father("GH",12,"男"); 10 11 Father F3=new Father("GH",19); 12 } 13 }
我们运行一下看看:
子类调用父类的构造函数:
使用super调用父类构造器的语句必须是子类构造器的第一条语句
如果子类构造器没有显式地调用父类的构造器,则将自动调用父类的默认(没有参数)的构造器。如果父类没有不带参数的构造器,并且在子类的构造器中又没有显式地调用父类的构造器,则java编译器将报告错误
如图:
给父类加上空的构造方法,编译就能通过;
默认调用父类无参的构造函数:
1 public Father() { 2 System.out.println("子类默认调用父类的无参构造函数"); 3 } 4 5 6 7 public class Son extends Father{ 8 9 } 10 11 12 13 public static void main(String[] args) { 14 // TODO Auto-generated method stub 15 Son s=new Son(); 16 }
结果:
我们能使用super关键字,进行对父类的构造函数进行自定义的调用:
1 package Constructor; 2 3 public class Son extends Father{ 4 5 public Son(String name, int age, String sex) { 6 super(name, age, sex); 7 // TODO Auto-generated constructor stub 8 } 9 10 11 } 12 13 14 15 16 17 package Constructor; 18 19 public class Test { 20 21 public static void main(String[] args) { 22 // TODO Auto-generated method stub 23 Son s=new Son("aaa", 12, "女"); 24 } 25 }
运行:
关于构造器就那么多了;