(三) java关键字之 this和super

首先从区别上来讲

1、本质来说,this是指向本类对象的一个指针,而super是Java中的一个关键字;
2、同样是指向对象,this是指向本类中的对象,而super是引用父类中的引用;

再从使用上来说

1、this和super都是方法层面的,因此不能在静态中使用,包括静态方法,静态成员,静态块;具体原因见这里
2、在子类的构造方法中调用父类构造方法时,super()必须位于子类构造方法的第一行,否则就会报错,这是因为构造方法在一开始初始化时就会被调用,为了防止子类构造方法调用父类中的成员,因此必须要先对父类的构造方法调用。
3、this() 方法也需要在本实例的构造方法的第一行调用,不过this()在有参的构造方法中调用,this(有参)需要在无参的构造方法中调用。

------------------------this---------------------------

例如

	private void setMethod(String book) {
		this.book = book;
	}

这个例子可以看出来,成员变量和setMethod()方法中的形式参数的名称相同,因此为了区分两个book,用this.book来表示本类中的成员变量book。实际上 this.book = book 的作用就是将形参的值赋给本类的成员变量。因此,this的一个很大的用途就是调用成员变量和成员方法。
如果不使用this,只是写成 book = book, 那么只是把参数book赋值给了参数变量本身而已,成员变量book的值并没有发生改变,因为参数book在方法的作用于中覆盖了成员变量book。

this()的使用

public class SuperTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		ThisTest test = new ThisTest();
//		test.TestMethod();
	}

}

class ThisTest{
	
	public ThisTest() {
//		this("无参构造方法被调用");
		System.out.println("无参构造方法");
	}

	 ThisTest(String s) {
		this();
		
		System.out.println("有参构造方法");
		System.out.println(s);
		
	}
	
}

这里是在有参构造方法中调用无参构造方法,运行结果
在这里插入图片描述
同样的,也可以在无参构造方法中调用有参的

public class SuperTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		ThisTest test = new ThisTest();
//		test.TestMethod();
	}

}

class ThisTest{
	
	public ThisTest() {
		this("无参构造方法被调用");
		System.out.println("无参构造方法");
	}
	public void TestMethod() {
		System.out.println("TestMethod方法");
	}
	
	 ThisTest(String s) {
//		this();
		
		System.out.println("有参构造方法");
		System.out.println(s);
		
	}
	
}

运行结果
在这里插入图片描述

------------------------super---------------------------

说到super就不得不提到类的继承。下面这个例子来看一下super在继承中的用法。

public class SuperTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		ChildTest test = new ChildTest();
		test.TestMethod();
	}

}

class ThisTest{
	
	public ThisTest() {
		System.out.println("父类的构造方法");
	}
	public void TestMethod() {
//		Test.
		System.out.println("父类的TestMethod方法");
	}
	
}

class ChildTest extends ThisTest{
	public ChildTest() {
		super();
//		super.TestMethod();
	}
	
	
	@Override
	public void TestMethod() {
		// TODO Auto-generated method stub
		super.TestMethod();
		System.out.println("子类重写的方法");
	}
	
}

上面的例子中有两个类,一个是ThisTest类,一个是继承自ThisTest的ChildTest的子类。在子类中,可以通过super()重写父类中的构造方法,不过由于构造方法是在对象被初始化的时候调用,使用在子类中即使不重写父类的构造方法也是会调用的。另外就是可以通过super.调用父类中的其他成员方法。比如在上面的例子里,重写了父类的TestMethod()方法,就自动调用了父类的被重写的方法

执行上面的程序
在这里插入图片描述
可以看到这里的super.TestMethod()便成功调用了父类的TestMethod()方法。而若是注释掉super.TestMethod()这一句

执行程序
在这里插入图片描述
可以看出来就没有再继续调用到父类的方法。

.
.
.
欢迎交流和指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值