this 关键字
this 关键字,代表当前对象,也就是指向对象本身的指针
this 的用法
区分成员变量和方法变量
1 | public class Person{ |
在 setName 中,方法变量 name 和成员变量name名称相同,为区分两个变量,使用 this 关键字引用成员变量;因为 this 关键字代表 Person 对象,修饰的变量 name(this.name)就是 Person 对象的成员变量 name ,另一个 name 采用方法的就近原则,指的是方法参数name
调用构造方法
1 | public class Person{ |
在同一个类中,无参构造方法中使用 this 调用另一个有参构造方法
对类对象的引用
1 | public class Person{ |
此时 return this 代表返回当前对象 Person 类
注意,如果在匿名内部类中使用,this 代表的是所在匿名类的对象,而不是外部调用类的实例
匿名内部类
1 | public class ThisClass{ |
此时 this 指的是匿名对象,而不是 ThisClass 对象
super 关键字
指向当前对象的父类,用super引用直接父类对象的成员;
super只能调用的是所在类的直接父类,在当前对象最近的父类;不能越过直接的父类调用父类以上的父类中的变量方法
super用法
子类构造方法调用父类的构造方法
super() 方法只能放在子类构造方法的第一行
1 | public class Father{ |
调用父类自身对象中同名变量、方法
如果子类中有变量或者方法和父类的变量或方法重名,那么可以使用super调用父类的变量或方法
但是访问父类的成员变量和方法时,注意不能访问父类的私有属性的变量方法!!!
1 | class Father{ |
以上程序中,Son继承了Father类
Son中有跟父类同名成员变量a,同名方法say()
- super.a:调用父类a变量,前提是父类的a变量是公有的
- super.num:是错误的!因为父类中的num是private,所有子类没有权限访问
- super.say():调用父类Father的say()方法,而不是子类的say()方法
调用父类的父类中的方法
super不能越过直接的父类调用父类以上的父类中的变量方法,但是如果想要访问父类的父类中的方法,在父类继承父类的父类中的成员方法后可以访问
1 | class A{ |
this 和 super 比较
- this 指向当前对象,调用本类的成员变量和方法;super指向父类,调用父类的成员变量和方法
- this和super语句都要放在构造方法中的第一行
- 每个子类继承父类之后,在子类的无参构造方法中第一条都会默认隐式调用super()方法调用父类无参构造方法
- this相当于本身对象的一个指针,用来调用当前对象的成员;而super不是指针,只是一个关键字