一个子类要调用父类的方法时,默认是使用this还是super? 一个子类要调用父类的方法时,默认是使用this还是super? 因为子类已经继承了父类的所有方法,子类也未去重写这些方法,这些方法实际上已经属于子类,那么使用时,如果我们不写this或super,类也不报错;使用this或super也正确。那我们什么也不写的那种情况到底默认是哪个? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 super是调用父类的构造函数。this.什么是调用父类中的方法 既然没有重写,调用supper和this都一样。重写了后supper调用父类的方法,this调用子类重写的方法。属性也是一样。很好理解的。 super相当于一个弗雷对象的引用,this相当与当前对象的一个引用。super的使用: 子类的构造方法中,调用父类的构造方法是,可以用super([父类构造方法中相应的参数列表]),在调用时,必须在子类构造方法的第一行。 子类方法中,子类复写了父类的方法,当调用该方法时,不想使用父类的方法,那么就用super.method(),调用父类的方法。this的使用: 在同一个类中,非静态方法可以用this.method()来掉用非静态的方法,this不能调用static修饰的成员方法和成员变量。 这是我的实验:看看下面的代码[html] view plaincopyprint?01.package com.java.three; 02. 03.public class Father { 04. 05. public void printTheInfomationOfThisMan(){ 06. System.out.println(this.toString()); 07. } 08. 09. public String name="父亲name"; 10. public int age=55; 11. public String sex="男"; 12. 13. public String getName() { 14. return name; 15. } 16. public void setName(String name) { 17. this.name = name; 18. } 19. public int getAge() { 20. return age; 21. } 22. public void setAge(int age) { 23. this.age = age; 24. } 25. public String getSex() { 26. return sex; 27. } 28. public void setSex(String sex) { 29. this.sex = sex; 30. } 31. @Override 32. public String toString() { 33. return "Father [name=" + name + ", age=" + age + ", sex=" + sex + "]"; 34. } 35. 36.} package com.java.three;public class Father { public void printTheInfomationOfThisMan(){ System.out.println(this.toString()); } public String name="父亲name"; public int age=55; public String sex="男"; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return "Father [name=" + name + ", age=" + age + ", sex=" + sex + "]"; }} [html] view plaincopyprint?01.package com.java.three; 02. 03.public class Son extends Father{ 04. 05. 06. public String ambution; 07. 08. public String getAmbution() { 09. return ambution; 10. } 11. //使用this给变量赋值 12. public void setAmbution(String ambution) { 13. this.ambution = ambution; 14. } 15. 16. 17. 18. //使用super给变量赋值 19. public void superSetInfoToSon(String name,int age){ 20. super.setName(name); 21. super.setAge(age); 22. } 23. 24. //使用this给变量赋值 25. public void thisSetInfoToSon(String name,int age){ 26. this.setName(name); 27. this.setAge(age); 28. } 29. 30. //这是我们要研究的重点,看看这种方式到底改变的是this的变量还是super的变量 31. //不适用this,也不使用super,给变量赋值 32. public void setInfoToSonWithoutNeither(String name,int age){ 33. namename=name; 34. ageage=age; 35. } 36. 37. 38. 39. 40. public void printTheInfomationOfSon(){ 41. System.out.println(this.toStringOfSon()); 42. } 43. public void printTheInfomationOfFather(){ 44. System.out.println(this.toStringOfFather()); 45. } 46. 47. //注意下面关键字this的使用 48. public String toStringOfSon() { 49. return "Son [ambution=" + this.ambution + ", name=" + this.name + ", age=" + this.age 50. + ", sex=" + this.sex + "]"; 51. } 52. //注意下面关键字super的使用 53. public String toStringOfFather() { 54. return "Son [ambution=" + ambution + ", name=" + super.name + ", age=" + super.age 55. + ", sex=" + super.sex + "]"; 56. } 57. 58.} package com.java.three;public class Son extends Father{ public String ambution; public String getAmbution() { return ambution; } //使用this给变量赋值 public void setAmbution(String ambution) { this.ambution = ambution; } //使用super给变量赋值 public void superSetInfoToSon(String name,int age){ super.setName(name); super.setAge(age); } //使用this给变量赋值 public void thisSetInfoToSon(String name,int age){ this.setName(name); this.setAge(age); } //这是我们要研究的重点,看看这种方式到底改变的是this的变量还是super的变量 //不适用this,也不使用super,给变量赋值 public void setInfoToSonWithoutNeither(String name,int age){ name=name; age=age; } public void printTheInfomationOfSon(){ System.out.println(this.toStringOfSon()); } public void printTheInfomationOfFather(){ System.out.println(this.toStringOfFather()); } //注意下面关键字this的使用 public String toStringOfSon() { return "Son [ambution=" + this.ambution + ", name=" + this.name + ", age=" + this.age + ", sex=" + this.sex + "]"; } //注意下面关键字super的使用 public String toStringOfFather() { return "Son [ambution=" + ambution + ", name=" + super.name + ", age=" + super.age + ", sex=" + super.sex + "]"; }} [html] view plaincopyprint?01.package com.java.three; 02. 03.public class Testmain { 04. 05. public static void main(String ssd[]){ 06.// Father ff=new Father(); 07.// ff.setName("父亲"); 08.// ff.setAge(55); 09.// ff.printTheInfomationOfThisMan(); 10. 11. Son ss=new Son(); 12. 13. System.out.println("----------------this--start-----------------------"); 14. ss.thisSetInfoToSon("给儿子命名this", 26);////使用this给变量赋值 15. ss.setAmbution("亿万富翁");//子类自己的方法 16. //ss.printTheInfomationOfThisMan();//继承父类的方法 17. 18. ss.printTheInfomationOfSon();//子类自己的方法,打印自己的变量this 19. ss.printTheInfomationOfFather();//子类自己的方法,打印父类的变量super 20. System.out.println("----------------this--end-----------------------"); 21. 22. 23. System.out.println("----------------super--start-----------------------"); 24. ss.superSetInfoToSon("给儿子命名super", 25);//使用super给变量赋值 25. ss.printTheInfomationOfSon();//子类自己的方法,打印自己的变量this 26. ss.printTheInfomationOfFather();//子类自己的方法,打印父类的变量super 27. 28. System.out.println("----------------super--end-----------------------"); 29. System.out.println(""); 30. System.out.println("----------------注意!!!-----------------------"); 31. System.out.println("----------------neither--start-----------------------"); 32. 33. //注意下面我们设置的信息是("给儿子命名neither", 18) 34. ss.setInfoToSonWithoutNeither("给儿子命名neither", 18);//不适用this,也不使用super,给变量赋值 35. ss.printTheInfomationOfSon();//子类自己的方法,打印自己的变量this 36. ss.printTheInfomationOfFather();//子类自己的方法,打印父类的变量super 37. System.out.println("----------------neither--end-----------------------"); 38. } 39. 40.} package com.java.three;public class Testmain { public static void main(String ssd[]){// Father ff=new Father();// ff.setName("父亲");// ff.setAge(55);// ff.printTheInfomationOfThisMan(); Son ss=new Son(); System.out.println("----------------this--start-----------------------"); ss.thisSetInfoToSon("给儿子命名this", 26);////使用this给变量赋值 ss.setAmbution("亿万富翁");//子类自己的方法 //ss.printTheInfomationOfThisMan();//继承父类的方法 ss.printTheInfomationOfSon();//子类自己的方法,打印自己的变量this ss.printTheInfomationOfFather();//子类自己的方法,打印父类的变量super System.out.println("----------------this--end-----------------------"); System.out.println("----------------super--start-----------------------"); ss.superSetInfoToSon("给儿子命名super", 25);//使用super给变量赋值 ss.printTheInfomationOfSon();//子类自己的方法,打印自己的变量this ss.printTheInfomationOfFather();//子类自己的方法,打印父类的变量super System.out.println("----------------super--end-----------------------"); System.out.println(""); System.out.println("----------------注意!!!-----------------------"); System.out.println("----------------neither--start-----------------------"); //注意下面我们设置的信息是("给儿子命名neither", 18) ss.setInfoToSonWithoutNeither("给儿子命名neither", 18);//不适用this,也不使用super,给变量赋值 ss.printTheInfomationOfSon();//子类自己的方法,打印自己的变量this ss.printTheInfomationOfFather();//子类自己的方法,打印父类的变量super System.out.println("----------------neither--end-----------------------"); }} 控制台打印:[html] view plaincopyprint?01.----------------this--start----------------------- 02.Son [ambution=亿万富翁, name=给儿子命名this, age=26, sex=男] 03.Son [ambution=亿万富翁, name=给儿子命名this, age=26, sex=男] 04.----------------this--end----------------------- 05.----------------super--start----------------------- 06.Son [ambution=亿万富翁, name=给儿子命名super, age=25, sex=男] 07.Son [ambution=亿万富翁, name=给儿子命名super, age=25, sex=男] 08.----------------super--end----------------------- 09. 10.----------------注意!!!----------------------- 11.----------------neither--start----------------------- 12.Son [ambution=亿万富翁, name=给儿子命名super, age=25, sex=男] 13.Son [ambution=亿万富翁, name=给儿子命名super, age=25, sex=男] 14.----------------neither--end----------------------- ----------------this--start-----------------------Son [ambution=亿万富翁, name=给儿子命名this, age=26, sex=男]Son [ambution=亿万富翁, name=给儿子命名this, age=26, sex=男]----------------this--end---------------------------------------super--start-----------------------Son [ambution=亿万富翁, name=给儿子命名super, age=25, sex=男]Son [ambution=亿万富翁, name=给儿子命名super, age=25, sex=男]----------------super--end---------------------------------------注意!!!---------------------------------------neither--start-----------------------Son [ambution=亿万富翁, name=给儿子命名super, age=25, sex=男]Son [ambution=亿万富翁, name=给儿子命名super, age=25, sex=男]----------------neither--end----------------------- 结论:子类继承的变量就是自己的,无论用this,或是用super都一样。还有一个问题我没看明白,希望高手解答:我们预想应该输出的("给儿子命名neither", 18)这个信息无论用this取,还是用super取,都取不出来!不知为什么,欢迎技术大牛给我留言。 public void setInfoToSonWithoutNeither(String name,int age){ name=name; age=age;}应为name和age就是这个传进来的参数name和age,相当于这个方法中的局部变量,而不是son的成员变量,它们自己赋值给自己,所以Son成员变量name和age的值不变。。 在没有覆写父类方法和属性的情况下this跟super都是一样的。因为他在当前对象中都找不到对应的方法和属性,所以会去该对象的父类中查找。说穿了其实调用的都是父类中的属性和方法。根据方法的调用顺序的话,不写this或super的情况下,默认为this 子类方法中,子类复写了父类的方法,当调用该方法时,不想使用子类的方法,那么就用super.method(),调用父类的方法。 我是这样想的.你看下对不对!!!!1.如果子类继承了父类,比如你的例子. 你的子类身上的name 和age 是父类的. get 和set方法也是父类的.那么你无论是调用this.setName(xxx)还是super.setName(xxx) 调用的都是父类的.所以此时,子类会改变父类的值的.2.另外,关于哪个好.我觉得两个可能思考. 让编译器跑得更爽.让看你代码的人更爽. 如果你想明白了这两点,那么你就知道,应该用this 就用this,应用super的时候就super . 所以,你在子类setName和setAge的时候,是应该使用super的. 对编译器来说,你使用了super,编译器就能直接去父类找setage方法,它不会在子类转了一大圈,发现子类没有setage然后才去找他老爸. 这样编译器会爽一些.另外,此处用super会更好.别人看了,容易看啊. 因为setage本来就是父类的. 你用this的话,别人看你代码的时候,他就会在你的子类找半天,操.发现根本没有找到.然后他才想明白,哦,原来是父类的....3.这样说,你会不会有点理解呢? 4.有空多交流. @zhhaojie Socket读写的问题 请教http摘要认证客户端的Java实现 傻傻的问一句什么eclipse插件能根据库表结构生成pojo和hibernate映射文件 关于结果集的问题 myeclipse 你的是否能更智能多一点呢? 导入一个MAVEN项目报的错…… jsp 测试的一个错误。。一直不会解决..特来请教 short和Short,long和Long 有何区别? session bean与entity bean之间如何交互! 无法生成hbm.xml 根据数据库里的坐标数据在jsp页面上绘图 正则表达式
super的使用:
子类的构造方法中,调用父类的构造方法是,可以用super([父类构造方法中相应的参数列表]),在调用时,必须在子类构造方法的第一行。
子类方法中,子类复写了父类的方法,当调用该方法时,不想使用父类的方法,那么就用super.method(),调用父类的方法。
this的使用:
在同一个类中,非静态方法可以用this.method()来掉用非静态的方法,this不能调用static修饰的成员方法和成员变量。
看看下面的代码[html] view plaincopyprint?
01.package com.java.three;
02.
03.public class Father {
04.
05. public void printTheInfomationOfThisMan(){
06. System.out.println(this.toString());
07. }
08.
09. public String name="父亲name";
10. public int age=55;
11. public String sex="男";
12.
13. public String getName() {
14. return name;
15. }
16. public void setName(String name) {
17. this.name = name;
18. }
19. public int getAge() {
20. return age;
21. }
22. public void setAge(int age) {
23. this.age = age;
24. }
25. public String getSex() {
26. return sex;
27. }
28. public void setSex(String sex) {
29. this.sex = sex;
30. }
31. @Override
32. public String toString() {
33. return "Father [name=" + name + ", age=" + age + ", sex=" + sex + "]";
34. }
35.
36.}
package com.java.three;public class Father {
public void printTheInfomationOfThisMan(){
System.out.println(this.toString());
}
public String name="父亲name";
public int age=55;
public String sex="男";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Father [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}}
[html] view plaincopyprint?
01.package com.java.three;
02.
03.public class Son extends Father{
04.
05.
06. public String ambution;
07.
08. public String getAmbution() {
09. return ambution;
10. }
11. //使用this给变量赋值
12. public void setAmbution(String ambution) {
13. this.ambution = ambution;
14. }
15.
16.
17.
18. //使用super给变量赋值
19. public void superSetInfoToSon(String name,int age){
20. super.setName(name);
21. super.setAge(age);
22. }
23.
24. //使用this给变量赋值
25. public void thisSetInfoToSon(String name,int age){
26. this.setName(name);
27. this.setAge(age);
28. }
29.
30. //这是我们要研究的重点,看看这种方式到底改变的是this的变量还是super的变量
31. //不适用this,也不使用super,给变量赋值
32. public void setInfoToSonWithoutNeither(String name,int age){
33. namename=name;
34. ageage=age;
35. }
36.
37.
38.
39.
40. public void printTheInfomationOfSon(){
41. System.out.println(this.toStringOfSon());
42. }
43. public void printTheInfomationOfFather(){
44. System.out.println(this.toStringOfFather());
45. }
46.
47. //注意下面关键字this的使用
48. public String toStringOfSon() {
49. return "Son [ambution=" + this.ambution + ", name=" + this.name + ", age=" + this.age
50. + ", sex=" + this.sex + "]";
51. }
52. //注意下面关键字super的使用
53. public String toStringOfFather() {
54. return "Son [ambution=" + ambution + ", name=" + super.name + ", age=" + super.age
55. + ", sex=" + super.sex + "]";
56. }
57.
58.}
package com.java.three;public class Son extends Father{
public String ambution; public String getAmbution() {
return ambution;
}
//使用this给变量赋值
public void setAmbution(String ambution) {
this.ambution = ambution;
}
//使用super给变量赋值
public void superSetInfoToSon(String name,int age){
super.setName(name);
super.setAge(age);
}
//使用this给变量赋值
public void thisSetInfoToSon(String name,int age){
this.setName(name);
this.setAge(age);
}
//这是我们要研究的重点,看看这种方式到底改变的是this的变量还是super的变量
//不适用this,也不使用super,给变量赋值
public void setInfoToSonWithoutNeither(String name,int age){
name=name;
age=age;
}
public void printTheInfomationOfSon(){
System.out.println(this.toStringOfSon());
}
public void printTheInfomationOfFather(){
System.out.println(this.toStringOfFather());
} //注意下面关键字this的使用
public String toStringOfSon() {
return "Son [ambution=" + this.ambution + ", name=" + this.name + ", age=" + this.age
+ ", sex=" + this.sex + "]";
}
//注意下面关键字super的使用
public String toStringOfFather() {
return "Son [ambution=" + ambution + ", name=" + super.name + ", age=" + super.age
+ ", sex=" + super.sex + "]";
}}
[html] view plaincopyprint?
01.package com.java.three;
02.
03.public class Testmain {
04.
05. public static void main(String ssd[]){
06.// Father ff=new Father();
07.// ff.setName("父亲");
08.// ff.setAge(55);
09.// ff.printTheInfomationOfThisMan();
10.
11. Son ss=new Son();
12.
13. System.out.println("----------------this--start-----------------------");
14. ss.thisSetInfoToSon("给儿子命名this", 26);////使用this给变量赋值
15. ss.setAmbution("亿万富翁");//子类自己的方法
16. //ss.printTheInfomationOfThisMan();//继承父类的方法
17.
18. ss.printTheInfomationOfSon();//子类自己的方法,打印自己的变量this
19. ss.printTheInfomationOfFather();//子类自己的方法,打印父类的变量super
20. System.out.println("----------------this--end-----------------------");
21.
22.
23. System.out.println("----------------super--start-----------------------");
24. ss.superSetInfoToSon("给儿子命名super", 25);//使用super给变量赋值
25. ss.printTheInfomationOfSon();//子类自己的方法,打印自己的变量this
26. ss.printTheInfomationOfFather();//子类自己的方法,打印父类的变量super
27.
28. System.out.println("----------------super--end-----------------------");
29. System.out.println("");
30. System.out.println("----------------注意!!!-----------------------");
31. System.out.println("----------------neither--start-----------------------");
32.
33. //注意下面我们设置的信息是("给儿子命名neither", 18)
34. ss.setInfoToSonWithoutNeither("给儿子命名neither", 18);//不适用this,也不使用super,给变量赋值
35. ss.printTheInfomationOfSon();//子类自己的方法,打印自己的变量this
36. ss.printTheInfomationOfFather();//子类自己的方法,打印父类的变量super
37. System.out.println("----------------neither--end-----------------------");
38. }
39.
40.}
package com.java.three;public class Testmain {
public static void main(String ssd[]){
// Father ff=new Father();
// ff.setName("父亲");
// ff.setAge(55);
// ff.printTheInfomationOfThisMan();
Son ss=new Son();
System.out.println("----------------this--start-----------------------");
ss.thisSetInfoToSon("给儿子命名this", 26);////使用this给变量赋值
ss.setAmbution("亿万富翁");//子类自己的方法
//ss.printTheInfomationOfThisMan();//继承父类的方法
ss.printTheInfomationOfSon();//子类自己的方法,打印自己的变量this
ss.printTheInfomationOfFather();//子类自己的方法,打印父类的变量super
System.out.println("----------------this--end-----------------------");
System.out.println("----------------super--start-----------------------");
ss.superSetInfoToSon("给儿子命名super", 25);//使用super给变量赋值
ss.printTheInfomationOfSon();//子类自己的方法,打印自己的变量this
ss.printTheInfomationOfFather();//子类自己的方法,打印父类的变量super
System.out.println("----------------super--end-----------------------");
System.out.println("");
System.out.println("----------------注意!!!-----------------------");
System.out.println("----------------neither--start-----------------------");
//注意下面我们设置的信息是("给儿子命名neither", 18)
ss.setInfoToSonWithoutNeither("给儿子命名neither", 18);//不适用this,也不使用super,给变量赋值
ss.printTheInfomationOfSon();//子类自己的方法,打印自己的变量this
ss.printTheInfomationOfFather();//子类自己的方法,打印父类的变量super
System.out.println("----------------neither--end-----------------------");
}}
控制台打印:[html] view plaincopyprint?
01.----------------this--start-----------------------
02.Son [ambution=亿万富翁, name=给儿子命名this, age=26, sex=男]
03.Son [ambution=亿万富翁, name=给儿子命名this, age=26, sex=男]
04.----------------this--end-----------------------
05.----------------super--start-----------------------
06.Son [ambution=亿万富翁, name=给儿子命名super, age=25, sex=男]
07.Son [ambution=亿万富翁, name=给儿子命名super, age=25, sex=男]
08.----------------super--end-----------------------
09.
10.----------------注意!!!-----------------------
11.----------------neither--start-----------------------
12.Son [ambution=亿万富翁, name=给儿子命名super, age=25, sex=男]
13.Son [ambution=亿万富翁, name=给儿子命名super, age=25, sex=男]
14.----------------neither--end-----------------------
----------------this--start-----------------------
Son [ambution=亿万富翁, name=给儿子命名this, age=26, sex=男]
Son [ambution=亿万富翁, name=给儿子命名this, age=26, sex=男]
----------------this--end-----------------------
----------------super--start-----------------------
Son [ambution=亿万富翁, name=给儿子命名super, age=25, sex=男]
Son [ambution=亿万富翁, name=给儿子命名super, age=25, sex=男]
----------------super--end---------------------------------------注意!!!-----------------------
----------------neither--start-----------------------
Son [ambution=亿万富翁, name=给儿子命名super, age=25, sex=男]
Son [ambution=亿万富翁, name=给儿子命名super, age=25, sex=男]
----------------neither--end-----------------------
结论:子类继承的变量就是自己的,无论用this,或是用super都一样。还有一个问题我没看明白,希望高手解答:
我们预想应该输出的("给儿子命名neither", 18)这个信息无论用this取,还是用super取,都取不出来!不知为什么,欢迎技术大牛给我留言。
public void setInfoToSonWithoutNeither(String name,int age){
name=name;
age=age;
}应为name和age就是这个传进来的参数name和age,相当于这个方法中的局部变量,而不是son的成员变量,它们自己赋值给自己,所以Son成员变量name和age的值不变。。
1.如果子类继承了父类,比如你的例子. 你的子类身上的name 和age 是父类的. get 和set方法也是父类的.
那么你无论是调用this.setName(xxx)还是super.setName(xxx) 调用的都是父类的.所以此时,子类会改变父类的值的.
2.另外,关于哪个好.我觉得两个可能思考. 让编译器跑得更爽.让看你代码的人更爽. 如果你想明白了这两点,那么你就知道,应该用this 就用this,应用super的时候就super . 所以,你在子类setName和setAge的时候,是应该使用super的. 对编译器来说,你使用了super,编译器就能直接去父类找setage方法,它不会在子类转了一大圈,发现子类没有setage然后才去找他老爸. 这样编译器会爽一些.
另外,此处用super会更好.别人看了,容易看啊. 因为setage本来就是父类的. 你用this的话,别人看你代码的时候,他就会在你的子类找半天,操.发现根本没有找到.然后他才想明白,哦,原来是父类的....
3.这样说,你会不会有点理解呢?
4.有空多交流. @zhhaojie