Java中this和super的区别

1.this

this关键字用来表示当前对象本身,或当前类的一个实例,通过this可以调用对象本身的所有方法和属性。

  • 可以使用this来区分同名变量

当成员变量与方法内部的变量重名时,而在方法内部希望能够调用成员变量,这个时候我们就可以用this来解决。

public class Demo1 {
	public String name;
	public int age;
	
	public Demo1(String name,int age){
		this.name = name;
		this.age = age;
	}
	
	public void say(){
		System.out.println("大家好!我叫"+this.name+",今年"+this.age+"岁了。");
	}
	
	public static void main(String[] args){
		Demo1 demo = new Demo1("猿小毛",21);
		demo.say();
	}

}

 运行结果:大家好!我叫猿小毛,今年21岁了。

在上面的Demo1中可以看出成员变量和形参重名,如果不使用this的话,那么访问到的就是局部变量name和age,而不是成员变量。

  • 可以用作方法名来初始化对象

相当于调用本类的其他构造方法。

public class Demo2 {
	public String name;
	public int age;
	
        //无参构造方法
	public Demo2(){
		this("猿小毛",21);
	}
	
        //带参构造方法
	public Demo2(String name,int age){
		this.name = name;
		this.age = age;
	}
	
	public void say(){
		System.out.println("大家好!我叫"+this.name+",今年"+this.age+"岁了。");
	}
	
	public static void main(String[] args){
		Demo2 demo = new Demo2();
		demo.say();
	}

}

 运行结果:大家好!我叫猿小毛,今年21岁了。

需要注意的是:

  1. 在构造方法中调用另一个构造方法时必须作为构造方法的第一句。
  2. 在一个构造方法内只能调用一个构造方法。
  3. 不能再构造方法以外的任何方法内调用构造方法。
  • 可以作为参数传递

需要在某些没有关联的类中调用另一个方法,并将当前对象的一个引用作为参数传递时。

public class Demo3 {

	public static void main(String[] args){
		B b = new B(new A());
	}

}

class A{

	public A(){
		new B(this).print();          //匿名对象
	}

	public void print(){
		System.out.println("这是A!");
	}
}

class B{

	A a;

	public B(A a){
		this.a = a;
	}
	
	public void print(){
		a.print();
		System.out.println("这是B!");
	}
}

运行结果:

这是A!
这是B!

2.super

super关键字与this类似,this用来表示当前类的实例,super用来表示父类。

super可以用在子类中,通过点号来获取父类的成员变量和方法。super也可用在子类的子类中,java能自动向上层类追溯。

  • 调用隐藏变量和被覆盖的方法

public class Demo4 {
	
	public static void main(String[] args){
		Student stu = new Student();
		stu.speak();
	}

}

class People{
	private String str = "我是一个People类";
	
	public String getStr(){
		return str;
	}
	
	public void speak(){
		System.out.println("我是People类中的speak方法");
	}
}

class Student extends People{
	
	public void speak(){
		System.out.println("我是Student中的speak方法");
		//调用父类的方法
		super.speak();
		//通过getter方法调用父类隐藏变量
		System.out.println("Student:"+super.getStr());
	}
}

运行结果: 我是Student中的speak方法
                   我是People类中的speak方法
                   Student:我是一个People类

  • 调用父类的构造方法

 在多数情况下,使用默认构造方法来对父类对象进行初始化,当然也可以用super来显式调用父类的构造方法。

public class Demo5 {
	public static void main(String[] args){
		Teacher tea = new Teacher("猿小毛","老师");
		tea.say();
	}

}

class Peoson{
	String name;
	
	public Peoson(String name){
		this.name = name;
	}
	
}

class Teacher extends Peoson{
	String job;
	
	public Teacher(String name,String job){
                //调用父类构造方法
		super(name);
		this.job = job;
	}
	
	public void say(){
		System.out.println("我的名字叫"+name+",我是一名"+job+"!");
	}
}

运行结果:    我的名字叫猿小毛,我是一名老师!       

注意:无论是super()还是this(),都必须放在构造方法的第一行。

如果编写一个构造方法,即没有调用super()也没有调用this(),编译器会自动插入一个调用到父类构造方法中,而且不带参数。

super 不是一个对象的引用,不能讲super赋值给另一个对象变量,它只是一个用来调用父类方法的特色关键字。                 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值