• Java面向对象-构造方法,this关键字


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

    构造方法

    概念:构造方法是一个特殊的方法,这个特殊方法用于创建实例时执行初始化操作;

    上代码:

     1 package com.java1234.chap03.sec04;
     2  
     3 /**
     4  * 定义人类
     5  * @author user
     6  *
     7  */
     8 public class People {
     9  
    10     // 定义属性 
    11     private String name; // 实例化对象时,默认值是null
    12     private int age; // 实例化对象时,默认值是0
    13      
    14     /**
    15      * 默认构造方法
    16      */
    17     People(){
    18         System.out.println("默认构造方法!");
    19     }
    20      
    21  
    22      
    23     public void say(){
    24         System.out.println("我叫:"+name+",我今年:"+age);
    25     }
    26      
    27     public static void main(String[] args) {
    28         People people=new People();
    29         people.say();
    30     }
    31 }

    运行输出:

    默认构造方法!

    我叫:null,我今年:0
     
     

    这里我们发现: 实例化对象的时候,String类型的默认值是null,int基本类型的默认值是0 ;

    People(){} 构造方法 

    特点 1,没有返回值类型,区别于其他一般方法;

           2,方法名和类名一样;

    我们现在可以写一个有参数的构造方法,用来初始化对象属性;

     1 package com.java1234.chap03.sec04;
     2  
     3 /**
     4  * 定义人类
     5  * @author user
     6  *
     7  */
     8 public class People {
     9  
    10     // 定义属性 
    11     private String name; // 实例化对象时,默认值是null
    12     private int age; // 实例化对象时,默认值是0
    13      
    14     /**
    15      * 默认构造方法
    16      */
    17     People(){
    18         System.out.println("默认构造方法!");
    19     }
    20      
    21     /**
    22      * 有参数的构造方法
    23      * @param name2
    24      * @param age2
    25      */
    26     People(String name2,int age2){
    27         System.out.println("调用的是有参数的构造方法");
    28         name=name2;
    29         age=age2;
    30     }
    31      
    32     public void say(){
    33         System.out.println("我叫:"+name+",我今年:"+age);
    34     }
    35      
    36     public static void main(String[] args) {
    37         // People people=new People();
    38         People people=new People("张三",20);
    39         people.say();
    40     }
    41 }

    运行结果

    调用的是有参数的构造方法

    我叫:张三,我今年:20
     
     

    这里我们定义了一个有参数的构造方法,参数有name2 age2,当调用构造方法的时候,用于赋值给name和age属性;

    注意点:

    1,假如没有构造方法,系统会自动生成一个默认的无参构造方法;

    上代码,我们去掉刚才定义的People(){} 

     1 package com.java1234.chap03.sec04;
     2  
     3 /**
     4  * 定义人类
     5  * @author user
     6  *
     7  */
     8 public class People {
     9  
    10     // 定义属性 
    11     private String name; // 实例化对象时,默认值是null
    12     private int age; // 实例化对象时,默认值是0
    13      
    14     /**
    15      * 默认构造方法
    16      */
    17     /*People(){
    18         System.out.println("默认构造方法!");
    19     }*/
    20      
    21     /**
    22      * 有参数的构造方法
    23      * @param name2
    24      * @param age2
    25      */
    26     /*People(String name2,int age2){
    27         System.out.println("调用的是有参数的构造方法");
    28         name=name2;
    29         age=age2;
    30     }*/
    31      
    32     public void say(){
    33         System.out.println("我叫:"+name+",我今年:"+age);
    34     }
    35      
    36     public static void main(String[] args) {
    37         People people=new People();
    38         //People people=new People("张三",20);
    39         people.say();
    40     }
    41 }

    我们把两个构造方法注释了,运行的话,依然没问题。

    2,假如有构造方法,系统不会自动生成构造方法;

    假如我们单独去掉无参数的构造方法,上代码:

     1 package com.java1234.chap03.sec04;
     2  
     3 /**
     4  * 定义人类
     5  * @author user
     6  *
     7  */
     8 public class People {
     9  
    10     // 定义属性 
    11     private String name; // 实例化对象时,默认值是null
    12     private int age; // 实例化对象时,默认值是0
    13      
    14      
    15     /**
    16      * 有参数的构造方法
    17      * @param name2
    18      * @param age2
    19      */
    20     People(String name2,int age2){
    21         System.out.println("调用的是有参数的构造方法");
    22         name=name2;
    23         age=age2;
    24     }
    25      
    26     public void say(){
    27         System.out.println("我叫:"+name+",我今年:"+age);
    28     }
    29      
    30     public static void main(String[] args) {
    31         People people=new People();
    32         //People people=new People("张三",20);
    33         people.say();
    34     }
    35 }

    我们会发现编译报错了:

    The constructor People() is undefined

    说找不到People()构造方法 

    this关键字

    this表示当前对象

    1,使用this调用本类中的属性和方法;

    2,使用this调用构造方法;

    我们上面的例子

    1 People(String name2,int age2){
    2     System.out.println("调用的是有参数的构造方法");
    3     name=name2;
    4     age=age2;
    5 }

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

    这里警告的意思 是自己赋值给自己 没有意义,这里的name和age变量 作用范围在方法里 所以和类里的属性名搭不上边;

    我们如何才行指定类里的属性呢,这时候this关键字派上用场了。

     

    我们可以用this关键字类执行当前对象  this.属性 实现;

    上代码:

     1 package com.java1234.chap03.sec04;
     2  
     3 /**
     4  * 定义人类
     5  * @author user
     6  *
     7  */
     8 public class People {
     9  
    10     // 定义属性 
    11     private String name; // 实例化对象时,默认值是null
    12     private int age; // 实例化对象时,默认值是0
    13      
    14     /**
    15      * 默认构造方法
    16      */
    17     /*People(){
    18         System.out.println("默认构造方法!");
    19     }*/
    20      
    21     /**
    22      * 有参数的构造方法
    23      * @param name
    24      * @param age
    25      */
    26     People(String name,int age){
    27         System.out.println("调用的是有参数的构造方法");
    28         this.name=name;
    29         this.age=age;
    30     }
    31      
    32     public void say(){
    33         System.out.println("我叫:"+name+",我今年:"+age);
    34     }
    35      
    36     public static void main(String[] args) {
    37         // People people=new People();
    38         People people=new People("张三",20);
    39         people.say();
    40     }
    41 }

    假如在我们还有需求,在构造方法中调用另外一个构造方法,比如默认构造方法里是基本的初始化,有参数的构造方法是附加初始化,

    再调用有参数的构造方法时候,我们先调用无参数构造方法,实现基本初始化,然后再进行附加初始化,这时候this关键字又派上用场了,

    我们调用this()就是调用无参数构造方法,括号里也可以加参数,来调用有参数的构造方法。

    上代码:

     1 package com.java1234.chap03.sec04;
     2  
     3 /**
     4  * 定义人类
     5  * @author user
     6  *
     7  */
     8 public class People {
     9  
    10     // 定义属性 
    11     private String name; // 实例化对象时,默认值是null
    12     private int age; // 实例化对象时,默认值是0
    13      
    14     /**
    15      * 默认构造方法
    16      */
    17     People(){
    18         System.out.println("默认构造方法!");
    19     }
    20      
    21     /**
    22      * 有参数的构造方法
    23      * @param name
    24      * @param age
    25      */
    26     People(String name,int age){
    27         this(); // 调用无参数的构造方法
    28         System.out.println("调用的是有参数的构造方法");
    29         this.name=name;
    30         this.age=age;
    31     }
    32      
    33     public void say(){
    34         System.out.println("我叫:"+name+",我今年:"+age);
    35     }
    36      
    37     public static void main(String[] args) {
    38         // People people=new People();
    39         People people=new People("张三",20);
    40         people.say();
    41     }
    42 }

    运行输出

    默认构造方法!

    调用的是有参数的构造方法
    我叫:张三,我今年:20
  • 相关阅读:
    原型链加强练习
    Javascript中的原型链,__proto__和prototype等问题总结
    HTTPS 到底加密了什么?
    PrismCDN 网络的架构解析,以及低延迟、低成本的奥秘
    取代 FlashP2P,H5P2P 将成为 WebP2P 主流
    低延时的P2P HLS直播技术实践
    深挖“窄带高清”的实现原理
    【省带宽、压成本专题】爱奇艺第一季度又烧了11个亿元,什么时候是个头?
    【省带宽、压成本专题】深入解析 H.265 编码模式,带你了解 Apple 全面推进 H.265 的原因
    让互联网更快,Server Push 特性及开启方式详解
  • 原文地址:https://www.cnblogs.com/eaglezb/p/5970318.html
Copyright © 2020-2023  润新知