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

    xiaoxiao2021-12-10  32

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

    我们会发现编译报错了:

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

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

    这里警告的意思 是自己赋值给自己 没有意义,这里的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
    转载请注明原文地址: https://ju.6miu.com/read-700006.html

    最新回复(0)