构造方法
1.构造方法是什么?
你有没有想过,为什么我们实例化对象的时候要new 类名()呢?
类中除了main方法和我们自定义的方法,还有一种特殊的方法:构造方法,也被称为构造器,它就是那个类名()。
构造方法是类中一种特殊的方法,它是一个与类同名的方法,并且没有返回值,参数可有可无。
语法:[4个权限修饰符] 类名([参数]){
类体;
}
例:
package com.dh.oop;
public class ConstructorDemo {
//构造方法
public ConstructorDemo(){
}
}
2.构造方法的作用
对象的创建是通过构造方法来实现的,其主要功能是完成对象的初始化,当类实例化对象时,会自动的调用构造方法。
说到这里,可能有人就纳闷了,我们在上篇博客中,明明没有书写构造方法,但还是new对象了呀,这是怎么回事呢?
我们来实验一下:去掉上述的构造方法,并且在main方法中实例化一个对象
package com.dh.oop;
public class ConstructorDemo {
//不书写构造方法
public static void main(String[] args) {
//实例化一个对象
ConstructorDemo cd = new ConstructorDemo();
}
}
运行是可以成功的,只不过我们只实例化了一个对象,没有其它操作,所以控制台没有内容输出。
所以这是不是我们弄错了构造方法的作用?并不是的,先别急,我们去看看该类的字节码文件。
扩展:如何在IDEA中查看class文件
我们查看一下该class文件:
可以看到,居然有一个构造方法!
所以,当我们不书写构造方法时,编译器会默认给我们提供一个无参的公有的构造方法。
3.构造方法的重载
既然系统已经给我们提供了默认的构造方法,那我们是不是不需要自己再书写构造方法了呢?并不是的,如果我们需要在构造方法里就初始化成员变量,这时候系统提供的默认的构造方法就做不到了,就需要我们自己书写一个我们需要的构造方法。
我们自己写一个带有参数的构造方法看看:
package com.dh.oop;
public class Person {
public String name;
public int age;
public Person(String name,int age){
//左边使用this来代表成员变量(下篇文章会说this的用法)
//右边的变量为构造方法的形式参数
this.name = name;
this.age = age;
}
public static void main(String[] args) {
//传递构造方法所需要的实参,实例化一个对象
Person person = new Person("Tom",3);
System.out.println(person.name+"\t"+person.age);
}
}
此时我们也去查看一下Person类的字节码文件:
可以看到,只剩下我们自己书写的有参构造方法了。
这是因为,当我们自己书写了构造方法时,编译器就不再提供构造方法了。
那我们还想要一个无参的构造方法呢?就需要我们自己去书写了,构造方法也和别的方法一样,支持重载。
package com.dh.oop;
public class Person {
public String name;
public int age;
//无参构造方法(建议自己写了非无参构造的构造方法后,也随便书写无参构造)
public Person(){
}
//有参构造方法
public Person(String name,int age){
//左边使用this来代表成员变量
//右边的变量为构造方法的形式参数
this.name = name;
this.age = age;
}
public static void main(String[] args) {
//有参构造实例化对象
Person person = new Person("Tom",3);
System.out.println(person.name+"\t"+person.age);
//无参构造实例化对象
Person person1 = new Person();
//可以看到,无参构造实例化对象初始化会比有参构造麻烦,但是有的时候我们就需要无参构造
person1.name = "jerry";
person1.age = 2;
System.out.println(person1.name+"\t"+person1.age);
}
}
构造方法很重要~
注意点总结:
构造器的方法必须与类同名;
构造器只能用四个权限修饰符修饰,不能用static等其它修饰符修饰;
构造器没有返回值,不是返回值为空,不能加void;
当我们不书写构造方法时,系统会默认提供一个无参的构造方法;
当我们书写构造方法时,系统将不再提供构造方法;
本人水平有限,若有错误,望指出。