Java:所有构造函数的通用代码?

时间:2013-11-09 03:13:00

标签: java constructor

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

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. 这个问题与询问构造函数是否也可以调用另一个问题不同 构造函数。因为在使用初始化程序块时,代码被称为AUTOMATICALLY,即。没有风险调用构造函数而忘记调用它

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

  4. 简而言之,我的问题是:初始化程序块是否可以获取参数?这与强制执行所有构造函数的某些参数有点相似。

  5. 编辑(2):

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

2 个答案:

答案 0 :(得分:5)

您可以通过调用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.
}

答案 1 :(得分: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";

你会忽略块中的代码,因为你在声明之前使用了变量!对于正常变量也一样!