this和super关键字

this和super的用法

this用于指代当前对象,super用于指代父类的内存空间的标识

this关键字

this代表其所在函数所属对象的引用。换言之,this代本类的对象引用

        1、当成员变量和局部变量重名,可以用关键字this来区分,this就是所在函数所属对象的引用

        2、对象调用了this所在的函数,this就代表哪个对象。一般方法调用默认加this

        3、通过this在构造函数中调用其它构造函数的时候,只能定义在构造函数的第一行,因为初始化动作要先执行,否则会报错

package com.yan5;

//this
public class Test4 {
	public static void main(String[] args) {
		new A4(10);
	}
}

class A4 {
	String name;
	private int age;
	public A4() {
		//		this();
		name="zhangsan";
		System.out.println("A4无参构造器");
	}
	public A4(String name1) {
		name=name1;
		System.out.println("A4有一个string类型参数的构造器");
	}
	public A4(int k) {
//		this();  //调用当前类的无参构造器,注意一定是另外一个构造器
		this("zhangsan");//调用当前类的另外一个构造器
		//注意:要求如果需要调用其它构造器,则this()必须是构造器种的第一句话 
		age=k;
		System.out.println("A4有一个int类型参数的构造器");
	}
	public void pp() {
//		this();  不允许在非构造器种调用this()
	}
}

class C4{
	private String name;
	public C4(String name) {
		//当属性名称和局部变量的名称一致时,按照就近原则,直接使用的就是局部变量
		System.out.println(name);  //和属性无关
		this.name=name;//this用于指代当前对象
	}
	public void setName(String name) {
		System.out.println(name);  //和属性无关
		this.name=name;
	}
	public void setAge(String name1) {
		this.name=name1;  //this.可写可不写
	}
	
	public void pp() {
		this.setAge("ddd");  //this用于表示当前对象,this.可写可不写
	}
}

super关键字

当本类的成员和局部变量同名用this区分,当子父类的成员变量同名用super区分父类

当子父类中出现函数一模一样的情况,会运行子类的函数。这种现象,称为覆盖操作,这是函数在子父类中的特性。在子类覆盖方法中,继续使用被覆盖的方法可以通过 super.函数名 来获取

this()表示调用当前类中的另外一个构造器,()中可以带有参数;super()表示调用父类中的某个构造器,()中可以带有参数

package com.yan5;

//super
public class Test5 {
	public static void main(String[] args) {
		A5 aa = new B5();  //属性的覆盖并使用父类声明变量,创建子类对象会导致出现二义性,所以一般不用属性的覆盖
		System.out.println(aa.id);  //输出的是父类种的属性值
		
		System.out.println(aa.getId());
		System.out.println(((B5)aa).getId1());
		
		aa.pp();
	}
}

class A5 {
	int id = 99;
	protected String age="bbb";
	public A5(int k) {
		System.out.println("int类型参数构造器");
	}
	public int getId() {
		return this.id;
	}
	public void pp() {
		System.out.println("A5:"+this.id);
	}
}
class C5{
	public C5() {
		super();
	}
}
class B5 extends A5 {
	String id = "zhangsan";
	//在一个构造器方法种第一句话一定是super()或者this()
	public B5() {
		super(10);
//		super();
	}
	public String getId1() {
		return this.id;
	}
	public void pp() {
		System.out.println(super.age);
		System.out.println(age);
		System.out.println("B5"+super.id);  //super用于指代父类对象 super.id表示父类种被覆盖的属性
		System.out.println("B5:"+this.id);
		
		//访问被覆盖的父类种定义的方法
		System.out.println("======================");
		super.pp();
	}
}

this()和super()

this()表示调用当前类中的另外一个构造器,()中可以带有参数

super()表示调用父类中的某个构造器,()中可以带有参数

特殊情况:

问题:父类已经定义了带参构造器后是否还有无参构造器?
没有,因为只有当不定义构造器时,系统才提供一个无参构造器。当自定义构造器时,系统不再提供无参构造器
因为子类的构造器中没有显式调用父类构造器,所以子类构造器方法中第一句是 super() 表示调用父类中的无参构造器,但是父类中没有无参构造器,所以报错

this和super的三种用法:

1、从语义的角度上说, this 用于指代当前对象; super 用于指代父类对象
2、 this() 表示调用另外一个构造器 ,super() 表示调用父类中的某个构造器, () 中的参数决定调用的是哪个构造器
3、 this. 成员属性用于表示当前对象的某个成员,一般用于局部变量和属性名称一致的场景下。 super. 成员属性用于表示父类中定义的某个属性,一般用于子类中覆盖定义了某个父类属性的场景下。
4、 this. 成员方法 () 用于表示当前对象的某个成员方法; super. 成员方法 () 用于表示当前类的父类中定义的某个成员方法,一般用于覆盖定义时【就近原则】。
5、在 static 方法中不允许使用 this/super 之类关键字

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值