this访问本类中的属性和方法,如果本类中没有此属性和方法,则在父类中继续查找;super访问父类中的属性和方法。this调用本类构造,必须放在构造方法的首行,表示当前对象;super调用父类构造,必须放在子类构造方法首行。
this的使用和说明:
this关键字只能用于方法体内,java虚拟机会给这个对象分配一个引用自身的指针,这个指针的名字就是this。
当方法中成员变量和局部变量同名时,成员变量被屏蔽,此时要访问成员变量就要用“this.成员变量”的方式引用成员变量,this(参数)调用的是当前类中的构造器。
public class TestThis {
private String name;
private int age;
private String passwd;
public TestThis(){
name = "Tom";
age = 23;
passwd = "12345";
}
public void printInfo(String name){
String passwd = "54321";
System.out.println(name+" "+age);//没加this的访问当前方法里的属性
System.out.println(this.name);//通过this引用的成员属性
System.out.println(passwd+this.passwd);
}
public static void main(String[] args) {
TestThis tt = new TestThis();
tt.printInfo("张三");
}
}
/*输出结果:
张三 23
Tom
5432112345
*/
super的使用和说明:
用于子类引用父类的成员,如属性、方法或者构造器
1.调用父类构造器:
super([arg_list]);
直接用super加上父类构造器所需要的参数,就可以调用父类的构造器了。若父类有多个构造器,根据形参列表类型和个数进行匹配就行了。
如果没有显示调用父类的构造器,则系统默认调用父类的无参构造器。
子类中的成员方法在使用super的时候,尽可能的使用private私有化。
2.调用父类的方法、属性:
super.属性
super.方法([arg_list])
要求父类的属性和方法必须是能让子类访问的属性或者方法(用protected或者public修饰的)。
package com.xinpoint.cn3;
public class Father {
public String v = "父类father";
public String x = "父类的成员变量";
public Father() {
System.out.println("Father无参构造方法被调用了");
}
public Father(String v){
this.v = "Father有参构造方法被调用了";
}
public void showMessage(){
System.out.println("Father的showMessage()方法被调用");
}
public static void main(String args[]){
}
}
//*******************************************************
package com.xinpoint.cn3;
public class Son extends Father{
public String v = "子类Son";
public Son() {
super();
System.out.println("Son的无参构造方法被调用");
}
public Son(String str){
super(str);
System.out.println("Son的有参构造方法被调用");
}
public void showMessage(){
System.out.println("Son的showMessage()方法被调用");
}
public void test(){
String v = "局部变量v覆盖了成员变量v和超类变量v";
System.out.println("-----------------------------");
System.out.println("子类局部变量v="+v);
System.out.println("子类成员变量v="+this.v);
System.out.println("父类成员变量v="+super.v);
System.out.println("子类继承而来的超类成员变量x="+x);
System.out.println("超类成员变量x="+super.x);
System.out.println("------------------------------");
showMessage();
this.showMessage();
super.showMessage();
}
public static void main(String[] args) {
Son son = new Son();
son.test();
}
}
/*运行结果:
Father无参构造方法被调用了
Son的无参构造方法被调用
-----------------------------
子类局部变量v=局部变量v覆盖了成员变量v和超类变量v
子类成员变量v=子类Son
父类成员变量v=父类father
子类继承而来的超类成员变量x=父类的成员变量
超类成员变量x=父类的成员变量
------------------------------
Son的showMessage()方法被调用
Son的showMessage()方法被调用
Father的showMessage()方法被调用
*/
*作者qq:57363961 微信:qq57363961 愿广交朋友,本人初学java,欢迎java学习者讨论和指教*