对于super,《The Java Programming Language》上这样说:In field access and method invocation, super acts as a reference to the current object as an instance of its superclass.可以理解为在需要访问the hidden field和进行父类方法调用的时候,super表现为指向作为父类的一个实例的当前对象的一个引用
java是解释性的语言,因此this和super不应该是地址。理解为引用可能更自然些
this 表示当前类的对象,super 表示对父类的某个构造器的调用
作者: 而今从头越2012 时间: 2013-1-4 10:51
关于这个问题,你先在头脑里形成这个概念:this通常指当前对象,super则指父类的,也有两外的用途,this调用当前对象的另一个构造函数。
光有这个概念还是不行的,接下来就要知道它们的具体用处了。举例说明吧:
(1)最普遍的情况就是,在你的方法中的某个形参名与当前对象的某个成员有相同的名字,这时为了不至于混淆,你便需要明确使用this关键字来指明你要使用某个成员,使用方法是“this.成员名”,而不带this的那个便是形参。另外,还可以用“this.方法名”来引用当前对象的某个方法,但这时this就不是必须的了,你可以直接用方法名来访问那个方法,编译器会知道你要调用的是哪一个。
public class DemoThis{
private String name;
private int age;
DemoThis(String name,int age){
setName(name);
//你可以加上this来调用方法,像这样:this.setName(name);但这并不是必须的
setAge(age);
this.print(); }
public void setName(String name){
this.name=name;//此处必须指明你要引用成员变量
}
public void etAge(int age){
this.age=age;
}
public void print(){
System.out.println("Name="+name+" ge="+age);
//在此行中并不需要用this,因为没有会导致混淆的东西
}
public static void main(String[] args){
DemoThis dt=new DemoThis("Kevin","22");
}
上面的代码很简单,你应该能够看得懂的。
(2)接下来再看看super的用法吧:
class Person{
public int c;
private String name;
private int age;
protected void setName(String name){
this.name=name;
}
protected void setAge(int age){
this.age=age;
}
protected void print(){
System.out.println("Name="+name+" Age="+age);
}
}
public class DemoSuper extends Person{
public void print(){
System.out.println("DemoSuper:");
super.print();
}
public static void main(String[] args){
DemoSuper ds=new DemoSuper();
ds.setName("heima");
ds.setAge(22);
ds.print();
}
}
(3)在构造函数中,this和super也有上面说的种种使用方式,并且它还有特殊的地方,请看下面的例子:
class Person{
public static void prt(String s){
System.out.println(s);
}
Person(){
prt("A Person.");
}
Person(String name){
prt("A person name is:"+name);
}
}
public class Chinese extends Person{
Chinese(){
super(); //调用父类构造函数(1)
prt("A chinese.");//(4)
}
Chinese(String name){
super(name);//调用父类具有相同形参的构造函数(2)
prt("his name is:"+name);
}
Chinese(String name,int age){
this(name);//调用当前具有相同形参的构造函数(3)
prt("his age is:"+age);
}
public static void main(String[] args){
Chinese cn=new Chinese();
cn=new Chinese("heima");
cn=new Chinese("heima",2);
}
}作者: 冉世友 时间: 2013-1-4 11:04
这是我记的笔记哈:
关键字: super 父类对象的引用
this 本类对象的引用
如果子类中出现非私有的同名成员变量时,
子类要访问本类中的变量,用this,子类要访问父类中的变量,用super。
super()可以访问父类的构造函数,this()可以访问本类的其他构造函数。
this()和super()都要求放在第一行,所以不能同时出现在同一构造函数中。
this
使用范围: 调用本类的方法或者属性
super
使用范围:从子类中调用父类的方法或者属性
this
调用属性:this.本类属性,从本类中查找
super
super。父类属性,从父类中查找
this
调用方法
this.本类方法()从本类中查找,
super
调用方法:
super
.父类方法,从父类查找
this
调用构造
放在本类的构造方法的首行,构造方法需要一个出口
{至少有一个构造方法没有用this调用}