this和super的区别
No. | 区别 | this | super |
1 | 操作属性 | this.属性:表示调用本类中的属性,如果本类中的属性不存在,则从父类查找 | super.属性:表示调用父类中的属性 |
2 | 操作方法 | this.方法():表示调用本类中的方法,如果本类中的方法不存在,则从父类查找 | super.方法():表示调用父类中的方法 |
3 | 调用构造 | this()调用本类中的其他构造方法 | super():由子类调用父类中的构造方法 |
4 | 查找范围 | 先从子类中查找,如果没有从父类中查找 | 不查子类直接查找父类 |
5 | 特殊 | 当前对象 | - |
既然this和super都可以调用构造,那么这两者绝对不能同时出现,因为只要是调用构造,就必须将语句放在构造方法的首行,而且以后开发的时候建议明确的写出“this.方法”或者“super.方法()”,这样便于代码的维护。
- 最好把super和this放在一起,对比着理解。
- super指向父类,用于引用父类的构造方法。
- this指向本类,用于引用本类中的其他方法。
- 这么说太抽象,下边是一个很经典的例子,完全体现了super和this的用法和区别,请花几分钟把它读完:
- class Person {
- public static void prt(String s) {
- System.out.println(s);
- }
- Person() {
- prt("A Person.");
- }//构造方法(1)
- Person(String name) {
- prt("A person name is:" + name);
- }//构造方法(2)
- }
- public class Chinese extends Person {
- Chinese() {
- super(); // 调用父类构造方法(1)
- prt("A chinese.");// (4)
- }
- Chinese(String name) {
- super(name);// 调用父类具有相同形参的构造方法(2)
- prt("his name is:" + name);
- }
- Chinese(String name, int age) {
- this(name);// 调用具有相同形参的构造方法(3)
- prt("his age is:" + age);
- }
- public static void main(String[] args) {
- Chinese cn = new Chinese();
- cn = new Chinese("kevin");
- cn = new Chinese("kevin", 22);
- }
- }
- 执行结果为:
- A Person.
- A chinese.
- A person name is:kevin
- his name is:kevin
- A person name is:kevin
- his name is:kevin
- his age is:22
- 下边总结一下super和this的异同:
- 1)super(参数):调用父类的构造方法 。
- 2)this(参数):调用本类的其他构造方法。
- 3)都必须放在构造方法的第一行。
- 3)super:引用父类中的成员,当子类和父类中的方法重名时,这样用。
- 4)this:代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)。
- 5)this()和super()都指的是对象,所以,均不能在static环境中使用。包括:static变量,static方法,static语句块。
- 6)从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。