在实例方法或构造函数中,this 是对当前对象的引用调用其方法或构造函数的对象。
可以使用 this 在实例方法或构造函数中引用当前对象的任何成员。
使用this关键字的最常见的情况是字段被方法或构造函数中的参数覆盖,用来区分实例变量和局部变量。
未使用this:
public class Point {
public int x = 0;
public int y = 0;
//constructor
public Point(int a, int b) {
x = a;
y = b;
}
}
使用this:
public class Point {
public int x = 0;
public int y = 0;
//constructor
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
构造函数的参数覆盖对象的字段,要引用Point字段x,构造函数必须使用this.x。
在构造函数中,使用this关键字调用同一类中的另一个构造函数。这样做称为显式构造函数调用。
public class Rectangle {
private int x, y;
private int width, height;
public Rectangle() {
this(0, 0, 1, 1);
}
public Rectangle(int width, int height) {
this(0, 0, width, height);
}
public Rectangle(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
...
}
此类包含一组构造函数。每个构造函数初始化矩形的部分或全部成员变量。构造函数为其初始值不是由参数提供的任何成员变量提供默认值。例如,无参构造函数Rectangle在坐标 0,0 处创建一个 1x1。两参数构造函数调用四参数构造函数,传入宽度和高度,但始终使用 0,0 坐标。和以前一样,编译器根据参数的数量和类型确定要调用的构造函数。
如果存在,另一个构造函数的调用必须是构造函数的第一行。
注:this()和super()必须放在构造函数的第一行,this和super不能同时出现在一个构造函数里面。
实例变量
实例变量是指在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
类的每个对象维护它自己的一份实例变量的副本。
局部变量
定义在方法之中的变量。
含义
实例变量:定义在类中但在任何方法之外。(New出来的均有初始化)
当一个对象被实例化之后,每个实例变量的值就跟着确定;
实例变量在对象创建的时候创建,在对象被销毁的时候销毁;
实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;
访问修饰符可以修饰实例变量;
实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;
实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;
实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObjectReference.VariableName。
异同
局部变量要先赋值,再进行运算,而实例变量均已经赋初值。(这是局部变量和实例变量的一大区别)
实例变量的对象赋值为null。
局部变量不允许范围内定义两个同名变量。实例变量的作用域在本类中完全有效,当被其他的类调用的时候也可能有效。
实例变量和局部变量允许命名冲突。
类变量(静态变量)
被static关键字修饰的变量。
类方法
static修饰的方法。
实例方法
由类创建实例调用。
class A {
public void instanceMethod() {
System.out.println("实例方法");
}
public static void staticMethod() {
System.out.println("静态方法");
//编译报错
instanceMethod();
new A().instanceMethod();
}
}
class B {
public void callInstanceMethod() {
//实例方法。
new A().instanceMethod();
//静态方法。
A.staticMethod();
}
}
不以物喜,不以己悲