分享

Java面向对象

 万网神 2018-04-26

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();
    }
}


运行输出:

1
2
默认构造方法!
我叫:null,我今年:0


这里我们发现: 实例化对象的时候,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();
    }
}


运行输出:

1
2
调用的是有参数的构造方法
我叫:张三,我今年:20


这里我们定义了一个有参数的构造方法,参数有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();
    }
}


我们会发现编译报错了:

QQ鎴浘20160904194106.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;
}


构造方法的属性名和类里的属性名不一致; 假如说我们搞成一致;

QQ鍥剧墖20160904195652.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



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多