super用途:在子类中访问超类“被隐藏的成员变量(无论是否静态)和静态方法”以及“被重写的实例方法”。这里的超类必须是“直接超类”,即子类之上最近的超类。
super的用法:
①在子类构造方法中调用超类的构造方法,用“super(ParamList)”的方式调用,ParamList根据超类构造方法而定,可以为空。另外super(ParamList)必须是子类构造方法的第一句。
②当超类的成员变量因与子类的成员变量同名而被隐藏时(成员变量隐藏与是否静态无关),可用"super.memberVariableName"来访问超类的成员变量。
注意:有些人说当超类的成员变量与子类某方法的局部变量或参数同名时,也属于被隐藏。那么一旦离开该方法隐藏还成立吗,显然这种说法是错误的。隐藏概念只限于成员变量范围,方法体内的局部变量与成员变量同名属于下面的this要讨论的内容。
假设有超类parent,其中有成员变量A,子类child,其中有方法method(type A)存在:
1)如果子类没有隐藏超类成员变量A,在method(type A)中,无论使用this.A还是super.A都是一样的,都会访问超类成 员变量A;(this.A就是继承下来的,换句话说,对于自然继承下来(没有隐藏/重写)的成员变量甚至是方法,super.memberName=this.membername)
2)如果子类有成员变量A隐藏了超类成员变量A,在method(type A)中,super.A=parent.A,this.A=child.A,两者有区别。
③当超类的静态方法/实例方法被子类隐藏/重写时,可使用"super.methodName(ParamList)"来访问超类方法。对于静态方法而言,这没什么奇怪,对于实例方法而言,这种用法使得超类被重写的方法在子类中可见。
最后需要注意,super关键字不能在静态方法中使用!
------this关键字------
this的用途:引用对象本身。
当一个对象创建后,Java虚拟机就会给这个对象分配一个引用自身的指针,这个指针的名字就是this。因此,this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this。并且this只和特定的对象关联,而不和类关联,同一个类的不同对象有不同的this。
this用法:
①在构造方法中,用this(ParamList)调用自己的另一个构造方法,this(ParamList)必须放在第一句位置!此用法只限于在构造方法中使用。
②某方法的参数或局部变量与某个成员变量同名时,在该方法中要访问该成员变量需要用“this.memberVariableName”的形式。
③某方法中需要引用其所属类的当前对象时,直接用this来引用当前对象。
示例代码: