一、构造器
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关键字在构造器、成员方法中可以做什么?
- 可以用于指定访问当前对象的成员。