先看这个例子
//Op1.java
public class Op1 {
String name;
public void set() {
String name;
name = "Find X";
}
}
在set()函数中,局部变量name与Op1类中的成员变量name同名,"Find X"这个字符串会给到谁呢?其实在这里有一个就近原则,即"Find X"会给到离它最近的局部变量name。这种情况要想给到成员变量name该怎么做呢?this关键字就派上了用场,this表示当前对象,使用this.成员变量名 来表示成员变量以区分同名的局部变量。C++也有个this指针,同样用来区分成员变量和局部变量,只不过代码格式为this->成员变量名。this关键字在后面提到的构造函数或setter函数中经常用到。
this使用场景:当成员函数中定义的局部变量与成员变量同名时,使用this来标识成员变量。
5. 构造函数定义:名字与类名相同的函数叫做构造函数。
构造函数不同于我们学到的
构造函数在创建对象时用到,具有两大作用:
1. 与new关键字搭配可创建对象
2. 给对象赋初值
在C++中,对象使用完要销毁时会用到析构函数,析构函数相对于构造函数,函数名前多了~波浪号,不过Java有良好的垃圾回收机制,不需要析构函数。
当自己的类中没有写构造函数,系统会默认生成一个无参构造函数,不执行任何操作。
虽然无参构造函数不执行任何操作,但属性(成员变量)并非没有初始值,对于基本数据类型的属性,对象创建时初始值为0;对于引用类型的属性,对象创建时初始值为null。
若自己已经写了构造函数,系统将不再生成构造函数,也就是说,如果你写的构造函数里面有参数,就不能用默认的无参构造函数来创建对象,如果非要用无参构造函数,就需要自己写一个了。
所以,不管是否用到无参构造函数,你都至少要写一个无参构造函数。如果要写一个有参构造函数,应该在其参数列表中加入类的所有属性,这样就可以在创建对象时实现一次性地为全部属性赋初值。
完美的构造函数应该这样定义
//Car.java
public class Car {
//成员变量:颜色、品牌、车牌号、价格
String color;
String brand;
String id;
double price;
public Car() {
}
//构造函数:通过传参给对象的各个属性初始化
public Car(String color, String brand, String id, double price) {
this.color = color;
this.brand = brand;
this.id = id;
this.price = price;
}
}
构造函数适用场景:创建新的对象
6. 面向对象编程第一要素——封装作为面向对象编程的一个核心要素,封装也不是一种技术,而是一种指导我们高效编程的思想。对封装最直观的理解就是把可以代表类的属性包装在一起,隐藏内部细节,只开放有限个方法来访问数据或操纵数据,避免数据被意外修改。这就好比一台手机,它的各种电子元器件都封装在里面,我们使用者不需要关心它里面是什么样,只需要操控屏幕或按键就行了。
其实,在学习方法(函数)时我们就已经用到了封装,只不过两者封装的东西不同
函数是对代码的封装,而类则是对数据的封装。
封装的方式就是将类中的成员变量访问权限全部设为private,对外开放getter和setter方法来访问和操纵成员变量。所以上面的Car.java的实例可以改成
//Car.java
public class Car {
//成员变量:颜色、品牌、车牌号、价格
private String color;
private String brand;
private String id;
private double price;
public Car() {
}
//构造函数:通过传参给对象的各个属性初始化
public Car(String color, String brand, String id, double price) {
this.color = color;
this.brand = brand;
this.id = id;
this.price = price;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
现在的Car.java,其所有成员变量(属性)均为private,但Car类中又提供了对外开放的getter(用于查看属性)和setter(用于修改属性)函数,所以这个Car类也叫JavaBean类(实体类)。



