Java面向对象-构造方法,this关键字
构造方法 概念:构造方法是一个特殊的方法,这个特殊方法用于创建实例时执行初始化操作;
上代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package com.java1234.chap03.sec04;
/**
* 定义人类
* @author user
*
*/
public class People {
// 定义属性
private String name; // 实例化对象时,默认值是null
private int age; // 实例化对象时,默认值是0
/**
* 默认构造方法
*/
People(){
System.out.println( "默认构造方法!" );
}
public void say(){
System.out.println( "我叫:" +name+ ",我今年:" +age);
}
public static void main(String[] args) {
People people= new People();
people.say();
}
}
|
运行输出:
这里我们发现: 实例化对象的时候,String类型的默认值是null,int基本类型的默认值是0 ; People(){} 构造方法 特点 1,没有返回值类型,区别于其他一般方法; 2,方法名和类名一样;
我们现在可以写一个有参数的构造方法,用来初始化对象属性; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | package com.java1234.chap03.sec04;
/**
* 定义人类
* @author user
*
*/
public class People {
// 定义属性
private String name; // 实例化对象时,默认值是null
private int age; // 实例化对象时,默认值是0
/**
* 默认构造方法
*/
People(){
System.out.println( "默认构造方法!" );
}
/**
* 有参数的构造方法
* @param name2
* @param age2
*/
People(String name2, int age2){
System.out.println( "调用的是有参数的构造方法" );
name=name2;
age=age2;
}
public void say(){
System.out.println( "我叫:" +name+ ",我今年:" +age);
}
public static void main(String[] args) {
// People people=new People();
People people= new People( "张三" , 20 );
people.say();
}
}
|
运行输出:
这里我们定义了一个有参数的构造方法,参数有name2 age2,当调用构造方法的时候,用于赋值给name和age属性;
注意点: 1,假如没有构造方法,系统会自动生成一个默认的无参构造方法;
上代码,我们去掉刚才定义的People(){} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | package com.java1234.chap03.sec04;
/**
* 定义人类
* @author user
*
*/
public class People {
// 定义属性
private String name; // 实例化对象时,默认值是null
private int age; // 实例化对象时,默认值是0
/**
* 默认构造方法
*/
/*People(){
System.out.println("默认构造方法!");
}*/
/**
* 有参数的构造方法
* @param name2
* @param age2
*/
/*People(String name2,int age2){
System.out.println("调用的是有参数的构造方法");
name=name2;
age=age2;
}*/
public void say(){
System.out.println( "我叫:" +name+ ",我今年:" +age);
}
public static void main(String[] args) {
People people= new People();
//People people=new People("张三",20);
people.say();
}
}
|
我们把两个构造方法备注了,运行的话,依然没问题。
2,假如有构造方法,系统不会自动生成构造方法;
假如我们单独去掉无参数的构造方法,上代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | package com.java1234.chap03.sec04;
/**
* 定义人类
* @author user
*
*/
public class People {
// 定义属性
private String name; // 实例化对象时,默认值是null
private int age; // 实例化对象时,默认值是0
/**
* 有参数的构造方法
* @param name2
* @param age2
*/
People(String name2, int age2){
System.out.println( "调用的是有参数的构造方法" );
name=name2;
age=age2;
}
public void say(){
System.out.println( "我叫:" +name+ ",我今年:" +age);
}
public static void main(String[] args) {
People people= new People();
//People people=new People("张三",20);
people.say();
}
}
|
我们会发现编译报错了: ![1472989323739049974.jpg QQ鎴浘20160904194106.jpg](http://image109.360doc.com/DownloadImg/2018/04/2610/131264807_1_20180426103240456.jpg)
The constructor People() is undefined 说找不到People()构造方法
this关键字 this表示当前对象
1,使用this调用本类中的属性; 2,使用this调用构造方法;
我们上面的例子 1 2 3 4 5 | People(String name2, int age2){
System.out.println( "调用的是有参数的构造方法" );
name=name2;
age=age2;
}
|
构造方法的属性名和类里的属性名不一致; 假如说我们搞成一致; ![1472990233161061978.png QQ鍥剧墖20160904195652.png](http://image109.360doc.com/DownloadImg/2018/04/2610/131264807_2_20180426103240847.png)
这里警告的意思 是自己赋值给自己 没有意义,这里的name和age变量 作用范围在方法里 所以和类里的属性名搭不上边;
我们如何才行指定类里的属性呢,这时候this关键字派上用场了。
我们可以用this关键字类执行当前对象 this.属性 实现;
上代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | package com.java1234.chap03.sec04;
/**
* 定义人类
* @author user
*
*/
public class People {
// 定义属性
private String name; // 实例化对象时,默认值是null
private int age; // 实例化对象时,默认值是0
/**
* 默认构造方法
*/
/*People(){
System.out.println("默认构造方法!");
}*/
/**
* 有参数的构造方法
* @param name
* @param age
*/
People(String name, int age){
System.out.println( "调用的是有参数的构造方法" );
this .name=name;
this .age=age;
}
public void say(){
System.out.println( "我叫:" +name+ ",我今年:" +age);
}
public static void main(String[] args) {
// People people=new People();
People people= new People( "张三" , 20 );
people.say();
}
}
|
假如在我们还有需求,在构造方法中调用另外一个构造方法,比如默认构造方法里是基本的初始化,有参数的构造方法是附加初始化, 再调用有参数的构造方法时候,我们先调用无参数构造方法,实现基本初始化,然后再进行附加初始化,这时候this关键字又派上用场了, 我们调用this()就是调用无参数构造方法,括号里也可以加参数,来调用有参数的构造方法,上代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | package com.java1234.chap03.sec04;
/**
* 定义人类
* @author user
*
*/
public class People {
// 定义属性
private String name; // 实例化对象时,默认值是null
private int age; // 实例化对象时,默认值是0
/**
* 默认构造方法
*/
People(){
System.out.println( "默认构造方法!" );
}
/**
* 有参数的构造方法
* @param name
* @param age
*/
People(String name, int age){
this (); // 调用无参数的构造方法
System.out.println( "调用的是有参数的构造方法" );
this .name=name;
this .age=age;
}
public void say(){
System.out.println( "我叫:" +name+ ",我今年:" +age);
}
public static void main(String[] args) {
// People people=new People();
People people= new People( "张三" , 20 );
people.say();
}
}
|
运行输出: 1 2 3 | 默认构造方法!
调用的是有参数的构造方法
我叫:张三,我今年:20
|
|