this关键字表示”调用方法的那个对象”的引用。
我们有时在写程序时会有这种需求,想要在方法内部获得当前对象的引用(就是调用当前方法的那个对象),那么就可以在方法内部使用this关键字代指当前对象的引用。
比如
public class Test {
public static void main(String[] args) {
new At().aa().sout();
}
}
class At{
public void sout(){
System.out.println(123);
}
public At aa(){
return this;
}
}
这段代码输出的就是123。
但要注意的是,如果在方法内部调用属于同一个类的另一个方法,不用使用this,直接调用即可,当中方法中的this引用会自动应用于同一个类中的其他方法。
当然也可以this来引用,不过编译器能帮你自动添加。
this另外一个应用就是在一个构造器内调用另一个构造器
在构造器中,如果为this添加了参数列表,那么就有了不同的含义。这将产生对符合此参数列表的某个构造器的明确调用;这样,调用其他构造器就有了直接的途径:
public class Test {
public Test(){
System.out.println("无参构造方法。。。");
}
public Test(int a){
this();
System.out.println("有一个参数为" + a + "的构造方法。。。");
//this(); this应放在第一行
}
public Test(int a,int b){
//this(); 一个构造方法内不能使用两个this
this(12);
System.out.println("有两个参数分别为" + a + "和" + b + "的构造方法。。。");
}
public static void main(String[] args) {
new Test(12,23);
}
}
在Java中,可以将一个数组赋给另一个数组
int[] a1 = {1, 2, 3, 4, 5};
int[] a2;
a2 = a1;
但真正做的只是复制了一个引用。
比如
public static void main(String[] args) {
int [] a1 = {1, 2, 3, 4, 5};
int [] a2;
a2 = a1;
for(int i = 0 ;i < a2.length; i++)
a2[i]++;
for(int i = 0; i < a1.length; i++)
System.out.print(a1[i] + " ");
}
结果:
可以看到代码中给出了a1的初始值,但a2没给,a2是在后面被赋给另一个数组的。由于a2和a1是相同的数组别名,因此通过a2所作的修改在a1还可以看到。
数组的可变参数方便了我们写代码,可以传任意个参数进去,甚至可以传0个,还支持自动装箱。
但在涉及到可变参数的重载时,就要注意了:
public class H2 {
public static void main(String[] args) {
f(1, 'a');
f('a', 'a');
}
static void f(float i, Character... args) {
System.out.println("first");
}
static void f(Character... args) {
System.out.print("second");
}
}
比如这段代码,在ide里不会报错,但编译时,就会出现如下情况:
可以看出来,这里‘a’字符被提升到了float类型,导致与重载方法都匹配的问题。
所以Think in java上建议我们应该总是只在重载方法的一个版本上使用可变参数列表,或者压根就不是用它。