52-Java面向对象:构造器、this关键字

一、构造器

1. 学习它的目的

  • 真正知道对象具体通过调用什么代码得到的
  • 能够掌握为对象赋值的其他简便写法
  • 为以后学习面向对象编程的其他内容做支撑

2. 它的作用

  • 定义在类中的,可以用于初始化一个类的对象,并返回对象的地址
    在这里插入图片描述

3. 它的语法格式

修饰符 类名(形参列表){

}
public class Car() {
    ...
    // 无参数构造器
    public Car() {
        ...
    }
        
    // 有参数构造器
    public Car(String n, double p) {
        ...
    }
}

4. 调用构造器得到对象的语法格式

类 变量名称 = new 构造器;
Car c1 = new Car();

Car c2 = new Car("宝马X6", 56.9);

5. 它的分类和作用

  • 无参数构造器(默认存在的,写不写都存在):初始化对象时,成员变量的数据均采用默认值。

    Car c1 = new Car();
    
  • 有参数构造器:初始化对象时,同时可以接收参数为对象进行赋值

    Car c2 = new Car("宝马XS", 78.9);
    
  • 示例:

    • 汽车类

      package com.app.constructor;
      
      public class Car {
          String name;    // 汽车名称
          double price;   // 汽车价格
      
          /**
              定义无参数构造器
           */
          public Car() {
              System.out.println("无参数构造器被调用了: ");
          }
      
          /**
              定义有参数构造器
           */
          public Car(String n, double p) {
              System.out.println("\n有参数构造器被调用了: ");
              // 接收到的参数 赋值给 当前对象的name、price
              name = n;
              price = p;
          }
      }
      
    • 实现类

      package com.app.constructor;
      
      /**
          目标:认识构造器,明白两种类型的构造器的作用
       */
      public class CarTest {
          public static void main(String[] args) {
              // 调用无参数构造器,得到对象
              Car c1 = new Car();
              // 赋值给当前对象的name、price ——> 添加汽车信息
              c1.name = "宝马";
              c1.price = 78.9;
              // 展示一下对象信息 ——> 展示汽车信息
              System.out.println("汽车品牌: " + c1.name);
              System.out.println("汽车价格: " + c1.price + "万");
      
              // 调用有参数构造器,得到对象,并传入汽车信息
              Car c2 = new Car("奔驰", 99.9);
              // 展示一下对象信息 ——> 展示汽车信息
              System.out.println("汽车品牌: " + c2.name);
              System.out.println("汽车价格: " + c2.price + "万");
          }
      }
      
    • 控制台

      无参数构造器被调用了: 
      汽车品牌: 宝马
      汽车价格: 78.9万
      
      有参数构造器被调用了: 
      汽车品牌: 奔驰
      汽车价格: 99.9万
      
      Process finished with exit code 0
      

6. 它的注意事项

  • 任何类定义出来,默认就自带了无参数构造器,写不写都有

    public class Car {
        ...
        // 定义类出来后,默认存在的无参数构造器
    }
    
  • 一旦定义了有参数构造器,那么默认存在的无参数构造器将不存在了。如果还想用无参数构造器,需要自己手写一个无参数构造器了

    public class Car {
        ...
        // 定义无参数构造器(由于你定义了有参数构造器,所以需要手写出来) 
        public Car() {
            ...
        }
        
        // 定义有参数构造器(一旦定义出来,想用无参数构造器,需自己手写出来)
        public Car(String name, double price) {
            ...
        }
        ...
    }
    

重点总结

1、构造器的作用?

  • 初始化类的对象,并返回对象的地址,说白了,就是得到一个对象

2、构造器有几种,各自的作用是什么?

  • 无参数构造器(定义类出来后,默认存在的,写不写都存在): 初始化对象时,成员变量的数据均采用默认值

    public class Car{
        String name;
        double price;
        
        // 无参数构造器(默认存在)
    }
    
    public class CarTest{
        public static void main(String[] args) {
            // 调用默认存在的无参数构造器,得到一个对象
            Car c1 = new Car();
            // 初始化对象时,成员变量的数据均采用默认值
            System.out.println(c1.name);
            System.out.println(c1.price);
        }
    }
    
    输出结果:
    
    null
    0.0
    
  • 有参数构造器: 初始化对象时,同时可以接收参数为对象赋值

    public class Car{
        String name;
        double price;
        
        // 有参数构造器
        public Car(String n, double p){
            // 接收到参数后为对象的成员变量赋值
            name = n;
            price = p;
        }
    }
    
    public class CarTest{
        public static void main(String[] args) {
            // 调用有参数构造器,得到一个对象,并为对象赋值
            Car c2 = new Car("奔驰", 99.9);	// 初始化对象时,同时可以接收参数为对象赋值
            System.out.println(c2.name);
            System.out.println(c2.price);
        }
    }
    
    输出结果:
    
    奔驰
    99.9
    

3、构造器有哪些注意事项?

  • 任何类定义出来后,默认存在一个无参数构造器,写不写都存在
  • 一旦定义有参数构造器,默认存在的无参数构造器将不存在了,想用无参数构造器时,需自己手写一个无参数构造器

二、this关键字

1. 它是什么

  • 它可以出现构造器、方法中

  • 它代表当前对象的地址

    public class Car{
        public Car() {
            System.out.println("this在无参数构造器中: " + this);
        }
        
        public void run() {
            System.out.println("this在方法中: " + this);
        }
    }
    
    public class CarTest{
        public static void main(String[] args) {
            Car c1 = new Car();
            c.run();
            System.out.println(c);
        }
    }
    
    输出结果:
    
    this在无参数构造器中: com.app.thisdemo.Car@404b9385
    this在方法中: com.app.thisdemo.Car@404b9385
    com.app.thisdemo.Car@404b9385
    
    Process finished with exit code 0
    

2. 它的作用

  • 可以用于指定访问当前对象的成员变量、方法。

3. 它在有参数构造器中的用法

  • 这种写法,在实际开发中,是会被嫌弃的
    在这里插入图片描述

  • 这种写法,并不能为当前对象的name、price进行赋值

    • 因为name、price接收到参数后,会就近赋值给局部的形参name、price——>也就是形参列表里的变量;

      而不会赋值给当前对象的name、price。

    • 这样一来,构造器会丧失了作用。
      在这里插入图片描述

  • 这种写法,就是完美的

    • 加了this关键字,会将name、price接收到的参数,赋值给当前对象的name、price;
    • 同时可以区分: 等号左边是当前对象的成员变量,等号右边是形参列表的变量(用于接收传入的参数)。
      在这里插入图片描述
  • 示例解释:

    • 没加this关键字,构造器将会丧失作用

      • 汽车类
      package com.app.thisdemo;
      
      public class Car {
          // 成员变量: 汽车品牌、价格
          String name;
          double price;
      
          /**
              有参数构造器
           */
          public Car(String name, double price) {
              System.out.println("有参数构造器被调用了: ");
              name = name;
              price = price;
          }
      }
      
      • 实现类
      package com.app.thisdemo;
      
      /**
          目标:理解this关键字的作用
       */
      public class CarTest {
          public static void main(String[] args) {
              System.out.println("--------this在有参数构造器中的用法--------");
              // 创建汽车对象并赋值
              Car c2 = new Car("宝马XF", 89.9);
              // 展示汽车信息
              System.out.println(c2.name);
              System.out.println(c2.price);
          }
      }
      
      • 控制台
      --------this在有参数构造器中的用法--------
      有参数构造器被调用了: 
      null
      0.0
      
      Process finished with exit code 0
      
      • 原因:
        在这里插入图片描述
    • 加了this关键字,恢复了构造器的作用

      • 汽车类
      package com.app.thisdemo;
      
      public class Car {
          // 成员变量: 汽车品牌、价格
          String name;
          double price;
      
          /**
              有参数构造器
           */
          public Car(String name, double price) {
              System.out.println("有参数构造器被调用了: ");
              this.name = name;
              this.price = price;
          }
      }
      
      • 实现类
      package com.app.thisdemo;
      
      /**
          目标:理解this关键字的作用
       */
      public class CarTest {
          public static void main(String[] args) {
              System.out.println("--------this在有参数构造器中的用法--------");
              // 创建汽车对象并赋值
              Car c2 = new Car("宝马XF", 89.9);
              // 展示汽车信息
              System.out.println(c2.name);
              System.out.println(c2.price);
          }
      }
      
      • 控制台
      --------this在有参数构造器中的用法--------
      有参数构造器被调用了: 
      宝马XF
      89.9
      
      Process finished with exit code 0
      
      • 原因:
        在这里插入图片描述

4. 它在成员方法中的用法

  • 这种用法,就相当于:

    • 创建汽车对象的时候,你给对象成员变量name赋值的是: 奔驰;
    • 你执行方法时传的name是: 宝马,当执行方法时,就会是: 宝马正在和宝马一起比赛!!
    • 这样对象成员变量就作用不到了,所以这样的用法当然是错误的!!
      在这里插入图片描述
  • 加了this后的用法,就相当于:

    • 创建汽车对象的时候,你给对象成员变量name赋值的是: 奔驰;
    • 你执行方法时传的name是: 宝马,当执行方法时,就会是: 奔驰正在和宝马一起比赛!!
    • 这样对象成员变量就作用到了,所以这样的用法当然是正确的!!
      在这里插入图片描述
  • 示例解释:

    • 没用this关键字,name将作用不到对象的成员变量

      • 汽车类
      package com.app.thisdemo;
      
      public class Car {
          // 成员变量: 汽车品牌、价格
          String name;
          double price;
      
          /**
           有参数构造器
           */
          public Car(String name, double price) {
              System.out.println("有参数构造器被调用了: ");
              this.name = name;
              this.price = price;
          }
      
          /**
              成员方法:赛车一起比赛的方法
           */
          public void goWith(String name) {
              System.out.println(name + " 正在和 " + name + " 一起比赛!!");
          }
      }
      
      
      • 实现类
      package com.app.thisdemo;
      
      /**
          目标:理解this关键字的作用
       */
      public class CarTest {
          public static void main(String[] args) {
              System.out.println("\n--------this在成员方法中的用法--------");
              // 创建汽车对象并赋值
              Car c3 = new Car("奔驰", 88.8);
              // 调用goWith方法,传入赛车名称
              c3.goWith("宝马");
          }
      }
      
      • 控制台
      --------this在成员方法中的用法--------
      有参数构造器被调用了: 
      宝马 正在和 宝马 一起比赛!!
      
      Process finished with exit code 0
      
      
      • 原因:
        在这里插入图片描述
    • 加了this关键字,name将作用到对象的成员变量

      • 汽车类
      package com.app.thisdemo;
      
      public class Car {
          // 成员变量: 汽车品牌、价格
          String name;
          double price;
      
          /**
           有参数构造器
           */
          public Car(String name, double price) {
              System.out.println("有参数构造器被调用了: ");
              this.name = name;
              this.price = price;
          }
      
          /**
              成员方法:赛车一起比赛的方法
           */
          public void goWith(String name) {
              System.out.println(this.name + " 正在和 " + name + " 一起比赛!!");
          }
      }
      
      • 实现类
      package com.app.thisdemo;
      
      /**
          目标:理解this关键字的作用
       */
      public class CarTest {
          public static void main(String[] args) {
              System.out.println("\n--------this在成员方法中的用法--------");
              // 创建汽车对象并赋值
              Car c3 = new Car("奔驰", 88.8);
              // 调用goWith方法,传入赛车名称
              c3.goWith("宝马");
          }
      }
      
      • 控制台
      --------this在成员方法中的用法--------
      有参数构造器被调用了: 
      奔驰 正在和 宝马 一起比赛!!
      
      Process finished with exit code 0
      
      
      • 原因:
        在这里插入图片描述

重点总结

1、this关键字是什么?

  • 出现在构造器和成员方法中,代表当前对象的地址

2、this关键字在构造器、成员方法中可以做什么?

  • 可以用于指定访问当前对象的成员
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值