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) 以供所有构造函数调用?

ps:我称{foo = 5;}为“通用代码”,但我猜这个功能还有另一个官方名称?

编辑(1):

  1. 我正在寻找的术语是初始化块

  2. 这个问题与询问一个构造函数是否也可以调用另一个构造函数不同。因为当使用初始化块时,代码被自动调用,即。没有风险调用构造函数并忘记调用它

  3. 我对使用“void init”的评论不好,确实在这种情况下调用另一个构造函数更好。

  4. 简而言之,我的问题是:初始化程序块可以带参数吗?这与强制实现所有构造函数上的某些参数有点相同。

编辑(2):

我现在想知道实现我所要求的唯一方法是否是使用继承来强制使用特定的构造函数。

4

2 回答 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.
}
于 2013-11-09T03:17:22.433 回答
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";

您将忽略块中的代码,因为您在声明之前使用了变量!正常变量也是如此!

于 2013-11-09T03:34:47.837 回答