关于super();的作用,望高手解答,谢谢

zapdos 2007-11-14 09:32:44
一般来说创建子类实例时,就会调用父类的构造函数

但是super();也是用于调用父类的构造函数,而且只能放在子类构造函数的第一句,也就是说不能利用super();来改变实例的构造过程啦

class a{
a(){
System.out.println("aaa");
}
}
public class test extends a{
test(){
//super();
}
public static void main(String args[]){
new test();
}
}
在对这个程序注释与不注释掉super();时,反编译出来的结果如下:

C:\java>javac test.java

C:\java>java test
aaa

C:\java>javap -c test
Compiled from "test.java"
public class test extends a{
test();
Code:
0: aload_0
1: invokespecial #1; //Method a."<init>":()V (没有注释的)
4: return

public static void main(java.lang.String[]);
Code:
0: new #2; //class test
3: dup
4: invokespecial #3; //Method "<init>":()V
7: pop
8: return

}


C:\java>javac test.java

C:\java>java test
aaa

C:\java>javap -c test
Compiled from "test.java"
public class test extends a{
test();
Code:
0: aload_0
1: invokespecial #1; //Method a."<init>":()V (注释了的)
4: return

public static void main(java.lang.String[]);
Code:
0: new #2; //class test
3: dup
4: invokespecial #3; //Method "<init>":()V
7: pop
8: return

}

在我看来,这两个结果毫无分别

那么,这个super();到底有什么作用呢?望高手解答,谢谢
...全文
153 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zapdos 2007-11-14
  • 打赏
  • 举报
回复
谢了,忘了还有参数,脑袋短路了
suxujie 2007-11-14
  • 打赏
  • 举报
回复
up
guoxyj 2007-11-14
  • 打赏
  • 举报
回复
up
jonathonc 2007-11-14
  • 打赏
  • 举报
回复
子类的构造函数默认调用父类的无参数的构造函数,也就是说虽然你没写Super(),但实际上调用了。
但如果在子类构造函数中带有有参数的构造函数如Super(a),则不隐式调用Super()而直接调用Super(a)。
把你的代码改一下,这时super(num);注释与否就会有不同。
class a{
a(){
System.out.println("without parameter");
}
a(int x){
System.out.println("with parameter");
}
}
public class test extends a{
test(int num){
super(num);
}
public static void main(String args[]){
new test(8);
}
}
zapdos 2007-11-14
  • 打赏
  • 举报
回复
晕....没人知道么?
iskyshop 2007-11-14
  • 打赏
  • 举报
回复
super调用父类的构造函数

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧