this(...)
will call another constructor in the same class whereas super()
will call a super constructor. If there is no super()
in a constructor the compiler will add one implicitly.
Thus if both were allowed you could end up calling the super
constructor twice.
Example (don't look for a sense in the parameters):
class A {
public A() {
this( false );
}
public A(boolean someFlag) {
}
}
class B extends A {
public B() {
super();
}
public B( boolean someFlag ) {
super( someFlag );
}
public B ( int someNumber ) {
this(); //
}
}
Now, if you call new B(5)
the following constructors are invoked:
this( false);
A() ---------------> A(false)
^
|
| super();
|
| this();
B() <--------------- B(5) <--- you start here
Update:
If you were able to use this()
and super()
you could end up with something like this:
(Attention: this is meant to show what could go wrong, if you were allowed to do that - which you fortunately aren't)
this( false);
A() ---------------> A(false)
^ ^
| |
| super(); | super( true ); <--- Problem: should the parameter be true or false?
| |
| this(); |
B() <--------------- B(5) <--- you start here
As you can see, you'd run into a problem where the A(boolean)
constructor could be invoked with different parameters and you'd now have to somehow decide which should be used. Additionally the other constructors (A()
and B()
) could contain code that now might not get called correctly (i.e. out of order etc.) since the call to super( true )
would circumvent them while this()
wouldn't.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…