本帖最后由 God’s favoure 于 2014-10-27 23:34 编辑
在面向对象学习的时候,this与super关键字很容易让人感觉到迷惑,当然了,我也不可避免的躺枪,为此,我对两个关键字进行分析总结,在这跟大家分享一下.
this,表示本类对象的引用,哪个对象调用,this就代表了哪个对象.
比如:class Person{
private String name;
private int age;
public Person(String name,int age){//通过构造赋值
this.name = name; //明确表示为本类中的name赋值
this.age = age;
}
public void getInfo(){ //取得信息
System.out.println("姓名:"+name+",年龄 :"+age);
}
}
public class Demo{
public static void main(String[]ags){
Person p = new Person("张大锤",16);
p.getInfo();
}
}
如果上面的一段小例子没有使用this 关键字的话,运行出来的结果,将会是默认值,也就是说,没有this 关键字赋值时候,属性就不能明确的被指出.
this的另一种用法,就是this()语句,在构造方法之间进行调用.
class Person{
private String name;
private int age;
public Person(){
System.out.println("无参构造函数");
}
public Person(String name,int age){//通过构造赋值
this();
this.name = name; //明确表示为本类中的name赋值
this.age = age;
}
public void getInfo(){ //取得信息
System.out.println("姓名:"+name+",年龄 :"+age);
}
}
public class Demo2{
public static void main(String[]ags){
Person p = new Person("张大锤",16);//调用有参构造方法
p.getInfo();
}
}此时输出结果与Demo不同的是,多出了一行:无参构造函数.
值得注意的是,构造方法是在实例化对象时候,被自动调用的,也就是说在类中的所有方法中,只有构造方法是被有线调用的,所以使用this调用构造方法必须也只能放在构造方法的第一行.
super关键字指向父类的存储空间,这句话与我听到的好多,指向父类的对象有冲突,但是可以肯定,super就是指向了父类的存储空间.这个可以通过一些个小代码短就可以检测出来.比如:Student s = new Student(); s是在栈内存中分配存储空间的,存的是一个地址,这个地址指向了堆内存中的new Student();那么,如果Student此时继承Person的话,他们的实质就是在堆内存中分配空间的new Student()里面继续划分出一个小的空间,取名叫super,而super也存有一个地址,这个地址指向父类Person的.
那么,知道了这些以后,super实用价值就体现出来了.
(1)引用父类的成员:super.变量 或 super.方法([参数列]),当然了,这个需要相应的访问权限.
(2)在子类构造方法中调用父类的构造方法:super([…]);//与this用法类似,应放在子类构造方法的第一行位置上
请注意:父类变量的初始化只能通过调用super([…])方法,由父类来完成,子类不可能“代劳”。只有父类变量的初始化完成之后,子类才开始其新增变量的初始化工作。
另一个问题是,都知道,this()和super()都需要放在构造函数第一行,那么,两个在一起的时候,到底谁在第一行呢?其实,两个是不能在一起的.哈哈,其实写了this(),默认的super()没有了.然而,无论第一行是this还是super,保证每个子类构造方法,直接还是间接都会访问到父类构造方法,就可以了.
|