##this关键字详解
关键字this
- this关键字必须放在非静态方法中,代表自身
- 1.引用实例变量
- 2.在自身构造函数内部引用其它构造函数
- 3.代表自身类的对象
- 4.引用成员方法
- 【引用实例变量】
- this引用实例变量可以用于解决实例变量与局部变量重名的问题。 例如:
class point {
int x , y;
point(int x, int y ){
this.x=x;//this.x代表具体对象的实例变量
this.y=y;
}
}
*在java中,实例变量的作用域是自身类,而局部变量的作用域是自身方法。
*当实例变量与局部变量重名时,局部变量会屏蔽实例变量。(类似于地方主义)
*【在自身构造函数内部引用其它构造函数】
*在构造函数内部使用this,它用于指代另外一个构造函数,但不能指代非构造函数。例如:
class point {
int x, y;
point( ){ this(-1,-1); }
point(int a, int b){ x=a; y=b; }
}
*注意事项:this调用构造函数的代码只能出现在构造函数内部的第一行可执行代码。
*这样,构造函数内部使用this调用构造函数最多出现一次。
*【代表自身类的对象】
*在一个类中,可以用this代表自身类的对象。
class IntVector {
int v[ ];
boolean equals(IntVector other) {
if (this == other) return true;
return false;
}
}
class testIntVector {
public static void main(String args[ ]){
IntVector t1=new IntVector( ),
t3=new IntVector( ), t2=t1;
System.out.println(t1.equals(t2)); //t1就是 this#true
System.out.println(t3.equals(t2)); //t3就是this #false
}
}
*this为调用当前方法的那个对象,即谁调用equals谁就是this。
*【级联调用】
import java.awt.*;
import java.applet.*;
class time{
private int hour, min, sec;
time( ) { setHour(0); setMin(0); setSec(0); }
time setHour(int h) { //注意该方法的返回值类型
hour=((h>=0 && h<24)? h: 0);
return this ;//将当前对象返回
// t.setHour(18)中t访问该方法,并返回t
}
time setMin(int m) {
min=((m>=0 && m<60)? m: 0);
return this ;
}
//t.setHour(18).setMin(30) == t.setMin(30)
time setSec(int s) {
sec=((s>=0 && s<60)? s: 0);
return this ;
}
String tostring( ){ return hour+":"+min+":"+sec ; }
}
public class timeToString extends Applet{ //程序的主类
private time t;
public void init( ){
t=new time( );
}
public void paint(Graphics g) {
//典型的级联调用
t.setHour(18).setMin(30).setSec(20);
g.drawString(" time:"+t.tostring( ),25,45);
}
} #time:18:30:20
例题:实现复数的加减法
package thirty;
class complex{
int realPart,imagPart;
public complex(int realPart, int imagPart) {
this.realPart = realPart;
this.imagPart = imagPart;
}
//(*)
complex add(complex c) {
//注意此处的返回值形式
(1)return new complex(realPart+c.realPart, imagPart+c.imagPart);
}
complex sub(complex c) {
(2)complex complex1 = new complex(realPart-c.realPart, imagPart-c.imagPart);
(2) return complex1;
//注意(1)与(2)的虽然形式不同,但效果等价
}
void show() {
if(realPart == 0 && imagPart == 0)
System.out.println(0);
else if (realPart == 0)
System.out.println(imagPart+"i");
else if(imagPart == 0)
System.out.println(realPart);
else if(imagPart < 0) {
int i = -imagPart;
System.out.println(realPart+"-"+i+"i");
}
else
System.out.println(realPart+"+" +imagPart+"i");
}
}
public class IntegerSet {
public static void main(String[] args) {
complex c1 = new complex(2,2);
complex c2 = new complex(2,4);
//(3)complex c3;
c3 = c1.add(c2 );
c3.show();
//级联调用中每一步返回的必须是【该类的对象】,
//所以(*)处的返回类型是complex.注意(3)与(4)的差别。虽形式不同,但效果等价
//(4)c1.sub(c2).show();
}
}
#
4+6i
-2i
*【引用成员方法】
*在一个类中,成员方法之间的相互调用可以用“this.方法名(参数)“来进行引用。只是所有这样的引用this都可以省略。