在学习this和super关键字时,发现它们有诸多相同点,同时这两个关键字非常常用,现对它们做以下的总结。
一、概况
This:
This指代当前对象,this()指代当前对象的其他构造函数
Super:
Super指代父类对象,super()指代父类的构造函数;
二、具体用法,对比super和this理解
1、this用作指代当前对象,super指代父类对象
A、this.成员变量,可调用当前对象的成员变量,一般是在当前类的某个方法的形参和当前的对象成员变量同名的时候用到
super.成员变量,调用父类的成员变量。
请观察以下代码,顺便讨论下继承的问题。
1 public class BokeCode{ 2 public static void main(String [] args){ 3 //另外,顺便观察下其他继承的特性 4 Bmw bmw1 = new Bmw(30); 5 System.out.println(bmw1.size);//输出的是子类的size 6 Car bmw2 = new Bmw(); 7 System.out.println(bmw2.size);//输出的是父类的size 8 } 9 } 10 11 class Car{ 12 int size; 13 public Car(int size){ 14 his.size = size; 15 System.out.println("我是Car的构造方法"); 16 } 17 } 18 19 class Bmw extends Car{ 20 /* 21 *重新定义size(其实意义不大,因为父类也有一个size了,成员变量不可以重载 22 *其实他们就是两个毫无关系的变量而已,只是名字一样 23 */ 24 int size; 25 public Bmw(int size){ 26 //调用父类构造方法 27 super(20); 28 System.out.println("我是父类对象的size " + super.size);//输出父类变量,值是20 29 /初始化子类的size 30 this.size = size; 31 System.out.println("我是子类对象的size " + this.size);//输出子类变量,值是30 32 System.out.println("我是初始化子类对象之后的父类对象的size " + super.size);//父类的size不受影响,输出还是20 33 34 } 37 }
B、this可以指代当前对象的方法,调用方法时可以用this.menthod();当然,在没有混淆的情况下,一般无需如此;当this后跟参数的时候,代指当前对象的对应相同参数的其他构造方法
Super.menthod()类似,指代调用父类的方法;当super后跟参数时,指代对应父类中有相同参数的构造方法。
二、使用注意事项
1、this和super在用于构造函数中(一般this和super后面跟参数是用于构造函数中调用其他构造函数)时,只能是构造函数的第一条语句,因为子类本身就继承了父类的所有方法还有属性,只有在父类对象被构造出来后再执行子类的构造方法的其他语句才是合理得,而this为什么也必须写在第一条语句中,是因为可以通过this调用其他构造方法,而其他构造方法有可能会有以super()的形式调用父类构造方法。
2、在子类中重载父类构造方法的时候,如果父类的构造方法时无参数的,可以不必写出supe();有参数是必须写出的;
调用本对象的属性方法时,可以以this.属性,this.方法来调用,但是一般不画蛇添足。
接着上面例子,补充几条下语句
class Car{ int size; public Car(int size){ this.size = size; System.out.println("我是Car的构造方法"); } public void drive(){ System.out.println("我是方法drive()"); } } class Bmw extends Car{ /* *重新定义size(其实意义不大,因为父类也有一个size了,成员变量不可以重载 *其实他们就是两个毫无关系的变量而已,只是名字一样 */ int size; public Bmw(int size){ //调用父类构造方法 super(20); System.out.println("我是父类对象的size " + super.size);//输出父类变量,值是20 //初始化子类的size this.size = size; System.out.println("我是子类对象的size " + this.size);//输出子类变量,值是30 System.out.println("我是初始化子类对象之后的父类对象的size " + super.size);//父类的size不受影响,输出还是20 } public void drive_fast(){ super.driver(); //调用父类方法 System.out.println("我是方法drive_fast()"); } public void method_test(){ this.driver_fast();//调用之类方法,但一般省略this } }