JAVA基础:(15)this和super的区别

时间:2023-02-15 18:37:39

        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学习者讨论和指教*