java 调用其他构造函数,如何在Java中从另一个调用一个构造函数?

是否可以从另一个(在同一类中,而不是在子类中)调用构造函数? 如果是,怎么办? 调用另一个构造函数的最佳方法是什么(如果有几种方法可以做到)?

#1楼

[ 注意:我只想添加一个方面,而我在其他答案中没有看到:如何克服this()必须在第一行的要求的限制)。 ]

在Java中,可以通过this()从构造函数中调用同一类的另一个构造函数。 但是请注意, this必须在第一行。

public class MyClass {

public MyClass(double argument1, double argument2) {

this(argument1, argument2, 0.0);

}

public MyClass(double argument1, double argument2, double argument3) {

this.argument1 = argument1;

this.argument2 = argument2;

this.argument3 = argument3;

}

}

那this有出现在第一线看起来像一个大的限制,但可以通过静态方法构建其他构造函数的参数。 例如:

public class MyClass {

public MyClass(double argument1, double argument2) {

this(argument1, argument2, getDefaultArg3(argument1, argument2));

}

public MyClass(double argument1, double argument2, double argument3) {

this.argument1 = argument1;

this.argument2 = argument2;

this.argument3 = argument3;

}

private static double getDefaultArg3(double argument1, double argument2) {

double argument3 = 0;

// Calculate argument3 here if you like.

return argument3;

}

}

#2楼

当我需要从代码内部调用另一个构造函数时(不在第一行中),我通常使用如下的辅助方法:

class MyClass {

int field;

MyClass() {

init(0);

}

MyClass(int value) {

if (value<0) {

init(0);

}

else {

init(value);

}

}

void init(int x) {

field = x;

}

}

但是,大多数情况下,我会尽可能尝试通过从第一行中较简单的构造函数中调用较复杂的构造函数来进行另一种方法。 对于上面的例子

class MyClass {

int field;

MyClass(int value) {

if (value<0)

field = 0;

else

field = value;

}

MyClass() {

this(0);

}

}

#3楼

对的,这是可能的:

public class Foo {

private int x;

public Foo() {

this(1);

}

public Foo(int x) {

this.x = x;

}

}

要链接到特定的超类构造函数而不是同一类中的构造函数,请使用super代替this 。 请注意, 您只能链接到一个构造函数 ,并且它必须是构造函数主体中的第一条语句 。

另请参见与 C#有关但适用相同原理的相关问题 。

#4楼

使用this(args) 。 首选模式是从最小的构造函数到最大的构造函数。

public class Cons {

public Cons() {

// A no arguments constructor that sends default values to the largest

this(madeUpArg1Value,madeUpArg2Value,madeUpArg3Value);

}

public Cons(int arg1, int arg2) {

// An example of a partial constructor that uses the passed in arguments

// and sends a hidden default value to the largest

this(arg1,arg2, madeUpArg3Value);

}

// Largest constructor that does the work

public Cons(int arg1, int arg2, int arg3) {

this.arg1 = arg1;

this.arg2 = arg2;

this.arg3 = arg3;

}

}

您还可以使用最近倡导的valueOf方法或“ of”方法:

public class Cons {

public static Cons newCons(int arg1,...) {

// This function is commonly called valueOf, like Integer.valueOf(..)

// More recently called "of", like EnumSet.of(..)

Cons c = new Cons(...);

c.setArg1(....);

return c;

}

}

要调用超类,请使用super(someValue) 。 对super的调用必须是构造函数中的第一个调用,否则会出现编译器错误。

#5楼

正如大家已经说过的,您可以使用this(…) ,这称为显式构造函数调用 。

但是,请记住,在这样的显式构造函数调用语句中, 您可能不会引用

任何实例变量或

任何实例方法或

此类中声明的任何内部类或任何超类,或

this或

super 。

如JLS(第8.8.7.1节)所述。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值