1.构造方法:
构造方法是一种特殊的方法,对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。
1.1先写一个无参构造方法
package Hello;
public class Person {
//定义类的属性
private String name;
private int age;
public void speak(){
System.out.println("我叫"+name+",我今年"+age);
}
//默认构造方法
Person(){
System.out.println("默认的构造方法!");
}
public static void main(String[] args) {
Person person=new Person();
person.speak();
}
}
输出结果:
默认的构造方法!
我叫null,我今年0
可以看到实例化对象的时候,String类型的默认值是null,int型默认值是0;
Person(){} 构造方法有一下特点:
1.没有返回值,区别于其他方法;
2.方法名和类名一样;
3.类实例化对象时会自动调用构造方法;
1.2有参构造方法
package Hello;
public class Person {
//定义类的属性
private String name;
private int age;
public void speak(){
System.out.println("我叫"+name+",我今年"+age);
}
//默认构造方法
Person(){
System.out.println("默认的构造方法!");
}
//有参数的构造方法
Person(String name1,int age1){
name=name1;
age=age1;
System.out.println("这是有参数的构造方法!");
}
public static void main(String[] args) {
Person person=new Person("张三",18);
person.speak();
}
}
输出结果:
这是有参数的构造方法!
我叫张三,我今年18
可以见到,当我们定义了有参构造方法后,系统会优先调用有参构造方法,不会选择无参构造方法;
在有参构造方法里,我们定义了参数name1和age1,当调用构造方法的时候,用于赋值给name和age属性;
注意:1.假如没有构造方法,系统会自动生成默认的一个无参构造方法,并且调用;
package Hello;
public class Person {
//定义类的属性
private String name;
private int age;
public void speak(){
System.out.println("我叫"+name+",我今年"+age);
}
//默认构造方法
/*Person(){
System.out.println("默认的构造方法!");
}*/
//有参数的构造方法
/*Person(String name1,int age1){
name=name1;
age=age1;
System.out.println("这是有参数的构造方法!");
}*/
public static void main(String[] args) {
Person person=new Person();
person.speak();
}
}
运行是没有问题的;
2.假如有构造方法,系统不会调用默认的构造方法
编译会报错!
2.this关键字
this表示当前对象
1,使用this调用本类中的属性;
2,使用this调用构造方法;
2.1在上面的例子中,在定义有参数的构造函数时:
//有参数的构造方法
Person(String name1,int age1){
name=name1;
age=age1;
System.out.println("这是有参数的构造方法!");
}
其中,参数name1和age1都可以改成name和age的,但是有一个问题:
这里警告显示:The assignment to variable name has no effect!
意思是对变量名的赋值是没有效果的;
显而易见,一看就肯定有问题,那么如何让类里的属性名和参数名保持一致呢?
这时我们可以用this关键字,用this.属性名是调用类里面的属性
package Hello;
public class Person {
//定义类的属性
private String name;
private int age;
public void speak(){
System.out.println("我叫"+name+",我今年"+age);
}
//默认构造方法
Person(){
System.out.println("默认的构造方法!");
}
//有参数的构造方法
Person(String name,int age){
this.name=name;
this.age=age;
System.out.println("这是有参数的构造方法!");
}
public static void main(String[] args) {
Person person=new Person("lisi",15);
person.speak();
}
}
输出结果为:
这是有参数的构造方法!
我叫lisi,我今年15
this.name是指类Person的属性name,而右边的name是指构造方法的参数name,要注意区分;
始终记住:this.属性名是调用类里面的属性
2.2用this调用构造方法;
上面例子中,我们定义了两个构造方法,系统会优先调用有参构造方法;
假如此时我们想两个构造方法同时调用,这时我们可以在有参数的构造方面里面调用无参构造方法,用this()调用;
package Hello;
public class Person {
//定义类的属性
private String name;
private int age;
public void speak(){
System.out.println("我叫"+name+",我今年"+age);
}
//默认构造方法
Person(){
System.out.println("默认的构造方法!");
}
//有参数的构造方法
Person(String name,int age){
this();
this.name=name;
this.age=age;
System.out.println("这是有参数的构造方法!");
}
public static void main(String[] args) {
Person person=new Person("lisi",15);
person.speak();
}
}
输出结果为:
默认的构造方法!
这是有参数的构造方法!
我叫lisi,我今年15
可以看到在有参构造方法里面调用了无参构造方法:this();
结果也输出了无参构造方法里面的内容!