黑马程序员技术交流社区
标题:
this和super的问题
[打印本页]
作者:
史卜坤
时间:
2012-7-7 13:27
标题:
this和super的问题
为什么this语句与super语句不能存在于同一构造函数中?
错误代码:
class Fu
{
Fu( )
{
System.out.println("fu run");
}
Fu(int x)
{
System.out.println("fu:"+x);
}
}
class Zi extends Fu
{
Zi( )
{
System.out.println("zi run");
}
Zi(int x)
{
this( );
super(7); //报错的位置。
System.out.println("zi:"+x);
}
}
class ExtendsDemo
{
public static void main(String[] args)
{
Zi z1=new Zi( );
Zi z2=new Zi(6);
}
}
作者:
曹恒业
时间:
2012-7-7 13:51
super() 和 this() 都要求在构造函数中的第一句位置调用,所以不可能在同一构造中同时调用super()和this()。
super()和this()分别是显示的调用了父类和子类的无参构造函数,如此JVM就不会自动调用默认的构造函数。
其实在不显示调用super()和this(),JVM还是会调用。
因此,如果你在构造函数显示的调用构造super()或者this(),必须是要放在第一个语句上。
作者:
邱泉
时间:
2012-7-7 14:01
原因很简单因为JAVA规定用this或super调用构造函数的语句必须是函数中的第一个语句,至于为什么,毕老师的视频中有解释:
因为如果this或super的语句不是第一句,那么this或super语句会把在它们前面的初始化动作覆盖掉。
例如下面的程序:
class person
{
private String name;
private int age;
person()
{
}
person(String name)
{
this.name = "haha";
}
person(String name, int age)
{
this.name = name; //此处p.name = "lisi"----------1
this(name); //结果这里p.name又被改成"haha"----------2
this.age = age;
}
}
class PersonDemo
{
public static void main(String[] args)
{
person p = new person("lisi",30); //想让p.name = "lisi",结果却被改成"haha"
}
}
所以结果不是想要得到的值。super同理。
所以this和super语句必须是函数的第一句。1,2两句对调,程序便可编译通过。
作者:
全海波
时间:
2012-7-9 15:53
class Fu
{
Fu( )
{
System.out.println("fu run");
}
Fu(int x)
{
System.out.println("fu:"+x);
}
}
class Zi extends Fu
{
Zi( )
{
System.out.println("zi run");
}
Zi(int x)
{
this( );
super(7); //报错的位置。解释:因为Java规定this只能放在构造函数的第一行,而super的性质跟this是一样的,也只能放在第一行,所以就会报错!
System.out.println("zi:"+x);
}
}
class ExtendsDemo
{
public static void main(String[] args)
{
Zi z1=new Zi( );
Zi z2=new Zi(6);
}
}
复制代码
作者:
山水游客
时间:
2012-7-9 17:12
{:soso_e197:}对于这个……路过
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2