在学习Java的过程中,this和super两个关键字总是很难理解。这里我来谈谈我的理解。
this
指当前类的对象(避开Java的就近原则)
-
调用当前类的构造方法
调用当前类的构造方法很好理解。this();
还有最普遍的情况就是,在你的方法中的某个形参名与当前对象的某个成员有相同的名字,这时为了不至于混淆,避开Java的就近原则,你便需要明确使用this关键字来指明你要使用某 个成员,使用方法是“this.成员名”,而不带this的那个便是形参。
另外,还可以用“this.方法名”来引用当前对象的某个方法,但这时this 就不是必须的了,你可以直接用方法名来访问那个方法,编译器会知道你要调用的是那一个。
但是指当前类的对象这就不好理解了。我如果创建了很多对象,那这个this到底指哪一个对象呢?还是它本身就是一个新的对象。原来的时候一直以为是一个新的对象。但是这样它是何时创建的呢?我创建的很多对象去调用相关方法的时候,都是this.method()。那么我创建的对象有啥作用呢?后来和朋友讨论的时候,才明白,this不是一个对象,它类似于一个变量名。当我创建对象的去调用相关方法的时候,那个对象去调用,那就把对象的内存地址赋给this。此时this也就代指那个对象。
但是又遇到了一个难题:
public class MyApplication extends Application {
public static MyApplication instance;
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
void printHello() {
Log.i("mingYue", "Hello~!");
}
}
这时我使用MyApplication.instance.printHello()
的时候岂不是陷入了死循环。但是却能正常运行~!求高手解惑。已被老白解惑。
上面代码this
就是MyApplication类的一个实例。因为``onCreate()这个方法都是这个实例来调用的。只是这个实例创建的过程我们没有看见而已。把上面的
MyApplication`类换成一个普通类就好理解了。
class A {
public static A instance;
void onCreate() {
instance = this;
}
}
这们这时来直接使用A.instance.onCreate()
方法就会出错了。因为这是instance
为null
。只有先new
一个A对象,调用onCreate()
方法之后,在这样使用就没问题了。而在上面的情况中,在一个应用开启时,就会创建一个MyApplication
对象,onCreate()
方法也会执行。所以this
也就是指的这个对象。
super
- 代指父类对象
- 调用父类构造方法