您的位置:首页 > 其它

面向对象之:this和super关键字

2014-10-27 23:35 239 查看
在面向对象学习的时候,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,保证每个子类构造方法,直接还是间接都会访问到父类构造方法,就可以了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐