2012-02-15 87 views
0

我知道我可以在构造函数内调用静态方法。我可以在构造函数之前调用方法

  1. 我有一个类,它是通过调用this(arguments)另一个构造一个构造器。

  2. 其次是第二个构造呼吁super(arguments)调用超级构造函数。

我想在执行这些构造函数之前执行一些代码。我不能使用static块。有任何想法吗?

+0

你从哪里调用构造函数?你不能在调用构造函数之前执行代码吗? – 2012-02-15 12:47:09

+2

使用非静态块。 – 2012-02-15 12:47:25

+1

这不是静态块。超级或替代构造函数调用必须是第一个语句。 – Nishant 2012-02-15 12:47:35

回答

4

你可以调用静态方法。我经常这样做:

public class MyClass extends SuperDuperClass { 

    public MyClass() { 
    this(convert("Foo!")); // convert will be executed 
          // other constructor is called 
    } 

    public MyClass(String arg) { 
    super(convert(arg)); // convert will be executed 
          // before superconstructor is called 
    } 

    private static String convert(String arg) { 
    return arg + "_modified"; 
    } 
} 

当然,我们不能调用实例方法或使用非静态字段。

(当然,这种模式需要在超级一个构造函数参数)

+0

Thanks.But在你的代码中使用超(转换(ARG));.中超将搜索超metho.My方法在该基类中。 – 2012-02-15 13:01:45

+0

用'this(..)'替换'super(..)' - 它没有区别。静态方法在任何其他构造函数之前调用。 – 2012-02-15 13:03:53

+0

再次感谢您,但您可以在我的问题中看到。一个costructor有这个,另一个构造函数已经超级了。我不能使用2个this或者2个super.Right? – 2012-02-15 13:07:26

3

super()调用必须是在构造函数中的第一条语句,除了那些你已经提到你不能使用静也不例外。

即使你没有明确写在你的构造函数的开始super()呼叫时,编译器把它放在你的。它永远在那里!

最好的办法是重构你的代码,所以你不需要在super()调用之前调用任何东西,但是没有看到代码(或者至少有更多背景),没有人可以告诉你如何最好做到这一点!

+0

在super()调用返回后,初始化器运行,所以不太可能有帮助。 – 2012-02-15 14:13:40

1

你不能 - 的第一件事,Java需要一个super.constructer电话 - 写还是不行!

1

使用工厂模式,所以你可以这样做:

public static MyObject newInstance() { 
    staticMethod(); 
    return new MyObject(); 
} 

假设是不应该静态方法来真正改变构造函数的行为,在执行构造函数之前,将字面上调用它。

+0

我的函数只需要一个参数进入构造函数,因为它是参数。 – 2012-02-15 13:08:49

+0

没有静态方法可以根据问题是使用,所以我认为@ berry120重构的想法可能更加得心应手 – Necronet 2012-02-15 13:09:48

1

你可以这样做,也没有一个静态块:

public Main() { 
    System.out.println("Inside Constructor"); 
} 

{ 
    System.out.println("Before Constructor"); 
} 

public void doTest() { 
    this.doTest(); 
} 
+0

在回复之前先了解一下。 – 2012-02-15 13:07:44

相关问题