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.假如有构造方法,系统不会调用默认的构造方法

Java面向对象——构造方法,this关键字_构造方法

编译会报错!

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的,但是有一个问题:

Java面向对象——构造方法,this关键字_编程_02

这里警告显示: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();

结果也输出了无参构造方法里面的内容!