Java:所有构造函数的公共代码?

4

在我看来,构造函数可以共享相同的代码,例如:

public class Foo {
 private int foo;
 {foo = 5;}
 public Foo(){}
 public Foo(int v){this.foo = v;}
 public int getFoo(){return foo;}
}   

代码“foo=5;”在两个构造函数中都被调用。

我认为您不能,但我想确认一下。不可能创建使用参数的通用代码吗?

例如,类似于:

public class Foo {
 private int foo;
 (int m){foo = m*5;}
 public Foo(int m){}
 public Foo(int v,int m){this.foo = v;}
 public int getFoo(){return foo;}
}   

据我所知,唯一的方法是创建一个私有的void init(int m)方法,并由所有构造函数调用。
附注:我把{foo = 5;}称为“常见代码”,但我猜这个特性还有另一个官方名称?
编辑(1):
1. 我要找的术语是初始化块。
2. 这个问题与询问构造函数是否也可以调用另一个构造函数不同。因为使用初始化块时,代码是自动调用的,即没有风险调用构造函数并忘记调用它。
3. 我关于使用"void init"的评论不好,实际上在这种情况下调用另一个构造函数更好。
4. 简而言之,我的问题是:初始化块可以接受参数吗?这有点像强制要求实现所有构造函数上的某些参数。
编辑(2):
我现在想知道实现我所要求的唯一方法是使用继承来强制使用特定的构造函数。

{}/常见的代码是初始化器 - gjman2
@VinceпјҢдҪ иғҪжҚўдёӘиҜҙжі•еҗ—пјҹеңЁжһ„йҖ еҮҪж•°дёӯпјҢеҸҜд»ҘдҪҝз”Ёthis(params p)жҲ–super()пјҲз”ЁдәҺзҲ¶зұ»пјүи°ғз”Ёе…¶д»–жһ„йҖ еҮҪж•°гҖӮ - 0x6C38
请看我在下面答案中的评论。我的问题略有不同。 - Vince
2个回答

6
您可以通过调用 this() 并匹配参数列表来从其他构造函数中调用您的构造函数。
例如,我有以下代码:
Foo(int a, int b) {
  // some code..
}

但我还想调用:

Foo(int a, int b, int c) {
  // some other code
}

我会这样说:
Foo(int a, int b) {
  this(a, b, 0);
  // Whatever other code you want in this constructor.
}

嗨,我的问题略有不同,因为在我的问题中,“公共代码”是自动调用的,这意味着没有创建新构造函数并忘记调用this(...)的风险。话虽如此,这完美地回答了我最后的评论(唯一的方法是使用init()...)。 - Vince

0

你需要理解Java创建对象的方式!假设你有

class A{

private String b = "b";
private static String a = "a";

{
   b = "b2";
}

static{
 a = "a2";  
}

public A()
{
 b = "b3";
}


} 

因此,这个想法是,当您创建一个对象时

new A();

第一个

private static String a = "a";

之后

static{
 a = "a2";  
}

之后

private String b = "b";

之后

{
   b = "b2";
}

仅在之后

public A()
{
 b = "b3";
}

但是要注意静态变量和静态块的优先级是相同的。普通变量和块的优先级也是相同的。因此,如果您放置下面的代码:

static{
 a = "a2";  
}

之后

private static String a = "a";

你会发现代码块中的代码被忽略了,因为你在声明之前使用了变量!普通变量也是如此!


顺便提一下,在 .Net 中,字段的优先级高于块,因此您可以在声明之前放置块。 - Anton
最后一段不正确。使用前向引用变量声明的静态或实例初始化块不是错误。试试看。 - user207421
是的,但是在静态块或普通块中都看不到赋值...所以变量似乎被忽略了!我的意思不是编译错误,我的意思是它不起作用。但在C#中可以工作。因此,即使块首先出现,也会发生赋值。 - Anton
我无法理解其中任何内容,但是你的编辑仍然是错误的。代码块没有被忽略,您可以轻松地自行验证。初始化声明会导致另一个赋值。它们都按照它们出现的顺序执行。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接