关键字this
一种指针,this表示当前对象本身,确切地说,this代表了当前对象的内存地址,它是对当前对象的引用,也可以理解为当前对象的名字。
class Cat{
……
f1(){
……
x=f2();
return x;
}
f2(){……}
}
public class TestCat{
Cat cat1=new Cat();
……
void b1(int x){……}
void b2(int n){
……
cat1.f1();
c=b1(x);
}
}
非静态方法,对象方法,谁在执行,f2没前缀,方法主体是谁,其实就是所谓当前对象,f1也是非静态,cat1中谁在执行f1,谁就在执行f2。Cat并不知道f1的调用者是谁,代词就是this.执行时的对象就是当前对象。
x=f2()——>x=this.f2()
c=b1(x)——>x=this.b1(x)
任何一个非static成员都属于某个具体的实例对象,在引用时必须要以其对象名作为前缀。对象的引用变量实际上存储的是该对象所在存储区域的地址,系统会根据对象引用变量找到对应的存储空间,来访问所需的成员变量或方法。
当前对象的地址是未知的,没有确定的标识符(对象名)可用,为此Java设计了专用关键字this,用来代表当前对象的地址。this代表尚未创建的对象。
this是缺省值,即,当属性或方法的调用未加前缀时,系统会自动指定其前缀为this。
上例中,b1方法的调用语句c=b1(x);也可改为:
c=this.b1(x);
this的三种实例
- 关键字this的一种常见用法就是引用类的hidden data fields(隐藏数据域)。
隐藏数据域
class SimpleCircle {
double radius;数据域变量被屏蔽
SimpleCircle() {
radius = 1.0;
}
//当数据域变量与局部变量同名时,数据域变量被屏蔽。
......局部变量
SimpleCircle(double newRadius) {
radius = newRadius;
}
......
void setRadius(double newRadius) {
radius = newRadius;
}
}
应改成:
class SimpleCircle {
double radius;
SimpleCircle() {
radius = 1.0;
}
......
SimpleCircle(double radius) {
this.radius = radius;
}
......
void setRadius(double radius) {
this.radius = radius;
}
}
- 关键字this的另一种常见用法是让构造方法调用同一个类的另一个构造方法。
调用重载的构造方法:
class SimpleCircle {
double radius;
SimpleCircle() {
radius = 1.0;
}
SimpleCircle(double radius) {
this.radius = radius;
}
......
}
class SimpleCircle {
double radius;
SimpleCircle() {
this(1.0);
}
SimpleCircle(double radius) {
this.radius = radius;
}
......
}
提高代码利用率:大量出现重复性操作
public class CircleWithPrivateDataFields {
private double radius ;
private static int numberOfObjects = 0;
public CircleWithPrivateDataFields(double radius) {
this.radius = (radius >= 0) ? radius : 0;
numberOfObjects++;
}
//public CircleWithPrivateDataFields() {
// radius=1.0;
// numberOfObjects++;
// }
public CircleWithPrivateDataFields() {
this(1.0);//转调
}
...... ......
}
存在可能重复的操作,使用this转调
- 关键字this是指向调用对象本身的引用名。
引用当前对象
import javax.swing.JFrame;//窗口类
import javax.swing.JOptionPane;
class MyFrame extends JFrame{
public MyFrame(){
setTitle("Window 1");
setSize(200, 150);
setLocation(200, 100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
......
JOptionPane.showMessageDialog(this,"测试窗口");//弹出窗口
......
}
}
弹出窗口showMessageDialog(小窗口的附窗口引用,内容)
谁传出来的,数据带回给谁,MyFram为当前主窗口
实验结果: