当你的类声明中没有包含任何构造器时候,编译器自动生成一个没有参数也不完成什么操作的默认构造器。 如果已经声明了一个具有一个或多个参数的构造器,除非明确定义否则不会生成默认的没有参数的构造器。 当对象被创建时,构造器调用是一个连接起来的调用序列,使对象的每个父类的构造器都会被调用。父类的构造器首先执行,以便子类可以访问父类的成员,而且可以保证在他们的构造器中定义的任何初始化工作都被执行。 除非你用super保留字和所需要的参数表来显式调用另外一个构造器,否则调用的是超类的无参数构造器的隐式调用。将出现 No-Argument Constructor not Found in Superclass
Java不像C++那样支持缺省参数
比如C++里
void find(String name, int age=4)
你可以这样用
find("F", 5);
也可以这样用
find("F");他就相当于find("F", 4);
这里因为函数签名的原因,导致和重载有点小摩擦
比如说,你重载了一个
find(String name)
那么,你调用find("F")的话,编译器怎么知道你是
想要find("F", 4);
还是你重载的那个find("F")?
Java虽然不像C++那样灵活
但是比C++简单,为了避免缺省参数和重载的冲突
Java干脆不支持缺省参数
如果已经声明了一个具有一个或多个参数的构造器,除非明确定义否则不会生成默认的没有参数的构造器。
当对象被创建时,构造器调用是一个连接起来的调用序列,使对象的每个父类的构造器都会被调用。父类的构造器首先执行,以便子类可以访问父类的成员,而且可以保证在他们的构造器中定义的任何初始化工作都被执行。
除非你用super保留字和所需要的参数表来显式调用另外一个构造器,否则调用的是超类的无参数构造器的隐式调用。将出现
No-Argument Constructor not Found in Superclass
一般 只写一个比较全面完整的构造函数
其它构造函数只要传递各自的参数就行了
String test1 = new String(test2,"GB2312");
或者
String test2 ;
//然后就使用
test2 = ....;
你说的第二种构造器的存在就是为了后面这样的情况。用这样的方式实例化一个类是因为你没有机会传递参数。或者说你当你需要使用默认的构造器。比如在做线程的时候也有这样的情况:事先不知道线程化的对象所属的类的构造器都是什么样的,因此只能用默认构造器--没有参数。你的例子中的第二个构造器调用了第一个构造器就是这个意思。