文章目录
前言
本文主要介绍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;
}
六、重写和重载的区别
总结
以上就是本文的全部内容。