区分Java中this引用、super关键字,区分方法重写、方法重载


前言

本文主要介绍Java中的this关键字以及super关键字,并区分Java中的方法重重载及方法重写。


一、this引用

1.为什么要有this引用

先来看一个例子:

public class Date {
    
    
	 public int year;  //为了简单起见,只定义了年。
	 public void setDay(int y){
    
    
		 year = y;
	 }
	 public void printDate(){
    
      //打印年份
		 System.out.println(year);
	 }
	 public static void main(String[] args) {
    
    
		 Date d1 = new Date();
		 d1.setDay(2020);//设置年份
		 // 打印内容
		 d1.printDate();
	 }
}

结果如下:
在这里插入图片描述
若将上述示例稍做改变:

public class Date {
    
    
	 public int year;  //为了简单起见,只定义了年。
	 public void setDay(int year){
    
    
		 year = year;
	 }
	 public void printDate(){
    
      //打印年份
		 System.out.println(year);
	 }
	 public static void main(String[] args) {
    
    
		 Date d1 = new Date();
		 d1.setDay(2020);//设置年份
		 // 打印内容
		 d1.printDate();
	 }
}

结果如下:
在这里插入图片描述

为了解决上述示例出现的问题,我们引出this引用

2.什么是this引用

java编译器给每个“成员方法”增加了一个隐藏的引用类型参数,该引用参数指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。

对上述代码进行改进:

public class Date {
    
    
	 public int year;  //为了简单起见,只定义了年。
	 public void setDay(int year){
    
    
		 this.year = year;
	 }
	 public void printDate(){
    
      //打印年份
		 System.out.println(year);
	 }
	 public static void main(String[] args) {
    
    
		 Date d1 = new Date();
		 d1.setDay(2020);//设置年份
		 // 打印内容
		 d1.printDate();
	 }
}

结果如下:
在这里插入图片描述

3. this引用的特性

① this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型。
② this只能在"成员方法"中使用。
③ 在"成员方法"中,this只能引用当前对象,不能再引用其他对象,具有final属性。
④ this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收。


二、super关键字

1.为什么要有super关键字?

当子类和父类中可能会存在相同名称的成员,若要在子类方法中访问父类同名成员时,如何操作?

Java提供了super关键字,其主要作用:在子类方法中访问父类的成员。

2.具体实例分析

例:

//父类
public class Animal{
    
     
	int a; 
	int b; 
	public void methodA(){
    
     
		System.out.	println("Animal中的methodA()");
    }
}
//子类继承了父类
public class dog extends Animal{
    
     
	int a; // 与父类中成员变量同名且类型相同 
	char b; // 与父类中成员变量同名但类型不同 
	public void methodA() {
    
     
		System.out.	println("dog中的methodA()方法"); 
   } 
   public void methodB(){
    
     
	// 对于同名的成员变量,直接访问时,访问的都是子类的 
	a = 10; // 等价于: this.a = 10; 
	b = 20; // 等价于: this.b = 20; 
	// 注意:this是当前对象的引用 
	// 访问父类的成员变量时,需要借助super关键字 
	// super是获取到子类对象中从基类继承下来的部分 
	super.a = 20; 
	super.b = 30; 
	// 如果在子类中要访问重写的基类方法,则需要借助super关键字 
	methodA(); // 直接访问,则永远访问到的都是子类中的methodA(),基类的无法访问到 
	super.methodA(); // 访问基类的methodA() 
	} 
} 


三、this、super的比较

1.相同点

① 都是Java中的关键字。
② 只能在类的非静态方法中使用,用来访问非静态成员方法和字段。
③ 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在。

2.不同点

① this是当前对象的引用,当前对象即调用实例方法的对象;super相当于是子类对象中从父类继承下来部分成员的引用
② 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性。
③ this是非静态成员方法的一个隐藏参数,super不是隐藏的参数。
④ 成员方法中直接访问本类成员时,编译之后会将this还原,即本类非静态成员都是通过this来访问的;在子类中如果通过super访问父类成员,编译之后在字节码层面super是不存在的
⑤ 在构造方法中:this()用于调用本类构造方法,super()用于调用父类构造方法,两种调用不能同时在构造方法中出现
⑥ 构造方法中一定会存在super()的调用,用户没有写编译器也会增加,但是this()用户不写则没有。

例:

//父类
public class Animal{
    
     
	int a; 
	int b; 
	public void methodA(){
    
     
		System.out.	println("Animal中的methodA()");
    }
}
//子类继承了父类
public class dog extends Animal{
    
     
	public void methodA() {
    
     
	//内容不同,重写了父类中的methodA()方法
		System.out.	println("dog中的methodA()方法"); 
   } 
}

四、方法重写

重写(override):也称覆盖。

子类父类非静态、非private修饰,非final修饰,非构造方法等方法进行重新编写, 返回值和形参都不能改变。即只能改变方法体内部({… })。

注意:
① 子类在重写父类的方法时,一般必须与父类方法原型一致:修饰符 返回值类型 方法名(参数列表) 要完全一致。
② JDK7以后,被重写的方法返回值类型可以不同,但是必须是具有父子关系的,即:子访问不能比父类中被重写的方法的访问权限更低。如:父类方法被public修饰,则子类中重写该方法就不能声明为 protected。
③ 父类被static、private修饰的方法、构造方法不能被重写。
④ 子类和父类在同一个包中,除 private 和、final 的方法。 其余方法都可以被重写。
⑤ 子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 、 protected 的非 final 方法。
⑥ 重写的方法, 可以使用 @Override 注解来显式指定。 该注解可以进行一些合法性校验。


五、方法重载

重载:多个方法的名字相同,参数列表不同。

注意:
① 方法名必须相同
② 参数列表必须不同(参数的个数不同参数的类型不同类型的次序不同 ,三者满足其一即可)
③ 与返回值类型是否相同无关。

例:以下三个方法构成重载

//方法1:
 public static int add(int x, int y) {
    
    
 return x + y; 
 }
//方法2:
 public static double add(double x, double y) {
    
    
 return x + y;
 }
 //方法3:
 public static double add(double x, double y, double z) {
    
    
 return x + y + z;
 }

六、重写和重载的区别

在这里插入图片描述


总结

以上就是本文的全部内容。

猜你喜欢

转载自blog.csdn.net/m0_53689542/article/details/124577683