Java之中this关键字和super关键字详解

 this关键字:

this的三大作用:this调用属性,调用方法,表示当前的对象

this是对当前对象的引用,是运行期间当前对象本身。

      (1).可以使用this明确的访问当前对象的属性或者方法,类似于“我”。

      (2).this()可以调用本类的其他构造器,可以实现构造器的重用,简化代码的实现。

      (3).this()必须写在构造器的第一行。

如下代码进行演示

1.最经常使用this关键字的情况,是在对象的一个属性被方法或构造器的参数屏蔽时,需要调用这个被屏蔽的属性,如下:

public class Point{
   int x;
   int y;
   //构造器
   public Point(int x,int y){
   //局部变量想x,y把Point类的属性屏蔽
      this.x=x;
      this.y=y;
   }
}

2.this调用本类构造器,在Point(int x)构造方法中调用了Point(int x,int y)构造方法,如下代码演示:

public class Point{
   int x;
   int y;
   public Point(int x){
      //调用本类中的构造器
      this(x,x);
   }
   //构造器
   public Point(int x,int y){
      this.x=x;
      this.y=y;
   }
}

注意:this()必须写在构造方法的第一行,因为在构造器之前是没有对象的。

3.this只能在方法内部使用,表示对“调用方法的那个对象”的引用。但要注意,如果在方法内部调用同一个类的另一个方法,就不必使用this,直接调用即可。当前方法中的this引用会自动应用于同一类中的其他方法,如下代码进行演示: 

public class Apricot {
	void pick() {}
	void pit() {
		pick();
	}
}

在pit()内部,你可以写this.pick(),但无此必要。编译器能帮你自动添加。只有当需要明确指出对当前对象的引用时,才需要使用this关键字,如果非要写成this.pick()也是可以的,但是这样就完全的失去我们使用高级语言的本质,所以大可不必。

4.可以使用this关键字调用重载构造方法。避免相同的初始化代码,只能在构造方法中用,并且必须位于构造方法的第一句。并且,除了构造器之外,编译器禁止在其他任何方法中调用构造器。 


class Person {
	String name;
	int age;
	public Person() {
		System.out.println("Person() constructor!");
	}
	public Person(String name, int age) {
		this();	// 调用本类中无参构造方法
		this.name = name;
		this.age = age;
		System.out.println("Person(String name, int age) constructor!");
	}
}
public class ThisConstructor {
	public static void main(String[] args) {
		{
			new Person("小光", 25);
		}
	}
}

运行结果如下:

5. this不能用于静态方法。main方法也是静态的,所以this也不能用于main方法,具体如下解释

tatic方法是类方法,先于任何的实例(对象)存在。即Static方法在类加载时就已经存在了,但是对象是在创建时才在内存中生成,而this指代的是当前的对象。

在方法中定义使用的this关键字,它的值是当前对象的引用。也就是说你只能用它来调用属于当前对象的方法或者使用this处理方法中成员变量和局部变量重名的情况.。

而且,更为重要的是this和super都无法出现在static 修饰的方法中,static 修饰的方法是属于类的,该方法的调用者可能是一个类,而不是对象。如果使用的是类来调用而不是对象,则this就无法指向合适的对象。所以static 修饰的方法中不能使用this。

super关键字:

在Java中,super关键字有两种作用:

       (1).用在类中引用其父类的构造函数。

       (2).用来调用基类的成员变量。

1.用在类中引用其父类的构造函数类,其格式如下:

super(【实参列表】);

其中的【实参列表】对应于父类的构造函数列表,例如:

//父类
public class Animal{
    private String name;
    public Animal(String name){
        this.name=name;
    }
    public void eat(String food){
        System.out.println("肚子饿了,吃东西!");
    }
}
//子类
public class Cat extends Animal{
   public Cat(){
      super("猫");
   }
   public void eat(){
      super.eat();
      System.out.println("喂我老鼠");
   }
}

当调用父类的某个构造是,super()应该写在子类构造函数的第一句。

2.用来调用基类的成员变量:

super可以用作前缀来引用父类的成员。例如,上例中Animal类与Cat类中都有eat()这个方法,当想在子类中引用父类的eat方法时,以示区别,我们必须使用super.eat()来引用父类中的eat()方法。

this和super的异同,如下:

*super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句) 
*this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)
*super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名    super.成员函数据名(实参)
*this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)
*调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
*super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。
*super()和this()均需放在构造方法内第一行。
*尽管可以用this调用一个构造器,但却不能调用两个。
*this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
*this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
*从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。
 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值