一、this
首先,我刚学到面向对象的时候,对于这个"this"还是一脸蒙逼的。就感觉是穿了一件外套,本来自己觉得已经学的比较熟练的实例化、方法的调用,然后碰到要用"this"的地方,实力打脸。好了,闲话不扯了,下面就开始谈一下我在实际操作过程中、查阅书本以及互联网上的资料之后对于"this"这个小崽子的理解。
this这个关键字只能用在方法的方法体内。当一个对象创建后,JVM就会给这个对象分配引用自己的指针,这个指针的名字就叫做this。也正因为如此,this只能用在非静态方法中。并且this只和特定的对象关联,而不和类关联(所以看到this就表示调用这个方法的对象)。同一个类的不同对象有不同的this(虽然都是this.但是含义是不同的)。下面是网上的一个综合实例:
public class Test{
private int number;
private String username;
private String password;
private int x = 100;
public Test(int n){
number = n;//这个可以写为this.number = n;
}
public Test(int i, String username, String password){
//成员变量和参数同名,成员变量被屏蔽,用"this.成员变量"的方式访问成员变量.
this.username = username;
this.password = password;
}
//默认不带参数的构造方法
public Test(){
this(0, "未知", "空");//通过this调用另外一个构造方法.
}
public Test(String name){
this(1, name, "空");
/*
* 通过this调用另外一个构造方法. 虽然上面的两种构造方法都是编译通过的。但是并没有实际的意义。一般我们会在参数多的构造函数里面去用this调用参数少的构造函数(并且只能放在方法体里面的第一行)。
* 示例里面的这种构造方法就相当于给了三个参数(其中两个参数已经定了,另一个参数在这个构造方法传入)。
*/
}
public Test(int i, String username){
this(i, username, null);//通过this调用另外一个构造方法.
}
}
this使用方法总结
通过this调用本类中另一个构造方法,用法是this(参数列表),这个仅仅在类的构造方法中可以用,并且只能放在类的构造方法的方法体的第一句。别的地方不能用。
方法参数或者方法中的局部变量和成员变量同名的情况下,成员变量被屏蔽,此时要访问成员变量则需要用“this.变量名”的方式来引用变量。但是,在没有同名的情况,可以直接用成员变量的名字,而不用this,用了也是正确的(看起来更加的直观)。
在方法中,需要引用该方法所属类的当前对象的时候,直接用this.
上面的说法可以做一个总结:“this是指向对象本身的一个指针”
二、super
在子类的构造方法中要调用父类的构造函数,用“super(参数列表)”的方式调用,参数不是必须的(如果子类的构造方法没有某个参数,但是父类的构造函数里面有这个参数,那么在super()的参数列表里的相应位置,我们传入参数null)。注意“super(参数列表)”这条语句只能放在子类构造方法的方法体的第一句。
当子类方法中的局部变量或者子类的成员变量与父类的成员变量同名时,也就是子类局部变量或者子类的成员变量覆盖了父类的成员变量时,用“super.成员变量”引用父类的成员变量。当然父类的成员变量没有覆盖,也可以用“super.成员变量名”来引用父类的成员变量(不过这是不必要的。因为在调用这个方法的时候,会先去看一下这个类里面有没有这个方法,如果本类中没有这个方法,那么系统就会自动去这个类的父类里面查找是否有这个方法。)
如果子类重写了父类的某一个方法。(也就是子类和父类有相同的方法定义,但是有不同的方法体),此时,我们可以通过"super.成员方法名"来调用父类里面的这个方法。