现有构造函数NewPeopleFunction如下:
final class NewPeopleFunction extends AbstractCRMFunction implements
ICustomerConstants {
String s="";
//构造函数
public NewPeopleFunction(EJBFactory factory) {
       super(s);
this.factory = factory;
}
}

我想在构造函数之前先执行如下代码,可以吗,该如何实现?
{
if(什么==什么)//先判断一下
s="aaaaaaaaaaaaaa";
else
s="bbbbbbbbbbbbbb";
}

解决方案 »

  1.   

    用静态游离块,不知道行不行,
    游离块是最先加载的final class NewPeopleFunction extends AbstractCRMFunction implements
            ICustomerConstants {
        String s="";
        static{
           if(什么==什么)//先判断一下
                s="aaaaaaaaaaaaaa";
           else
               s="bbbbbbbbbbbbbb";
        }

        //构造函数
        public NewPeopleFunction(EJBFactory factory) {
           super(s);
            this.factory = factory;
        }
    } 不知道符不符合你的要求
      

  2.   


    final class NewPeopleFunction extends AbstractCRMFunction implements
            ICustomerConstants {
            String s="";
          {
        if(什么==什么)//先判断一下
        s="aaaaaaaaaaaaaa";
            else
        s="bbbbbbbbbbbbbb";
        }    //构造函数
        public NewPeopleFunction(EJBFactory factory) {
           super(s);
            this.factory = factory;
        }
        }
    这样就可以了。
      

  3.   

    final class NewPeopleFunction extends AbstractCRMFunction implements
            ICustomerConstants {
            String s="";
        //构造函数
        public NewPeopleFunction(EJBFactory factory) {
           super(s);
            this.factory = factory;
        }   static{
        if(什么==什么)//先判断一下
        s="aaaaaaaaaaaaaa";
            else
        s="bbbbbbbbbbbbbb";
        }    }
      

  4.   

    应该是可以的,把这段代码设成静态块(static),静态块在构造函数之前先执行.
      

  5.   


    这里的S是一个成员变量,而不是一个静态变量,要这样使用static肯定不行的,因为static在对象构造之前就会执行,而这时这个成员变量从何而来??!请问?呵呵
      

  6.   

    final class NewPeopleFunction extends AbstractCRMFunction implements
            ICustomerConstants {
            String s="";
        //构造函数
        {
          if(什么==什么)//先判断一下
             s="aaaaaaaaaaaaaa";
          else
            s="bbbbbbbbbbbbbb";
        }//不能用静态初始化区域    public NewPeopleFunction(EJBFactory factory) {
           super(s);
            this.factory = factory;
        }
        }
      

  7.   

    {
     //非静态初始化块
    }static {// 静态初始化块
    }
    // Consturctor
    public ClzName() {}
      

  8.   


    final class NewPeopleFunction extends AbstractCRMFunction implements ICustomerConstants {    String s = "";    //初始化块:可以有多个,按代码中出现顺序先于构造方法执行。
        {
            if (什么 == 什么) //先判断一下
                s = "aaaaaaaaaaaaaa";
            else
                s = "bbbbbbbbbbbbbb";
        }    //构造方法
        public NewPeopleFunction(EJBFactory factory) {
            super(s);
            this.factory = factory;
        }}
      

  9.   

    2楼代码:报错super(s);//报错cannot refer to an instance field mytype while explicitly invoking a construtor
      

  10.   

    我的意思是只要能先判断得到S,再调用父类的super(s),这个功能好像不能实现了。。
      

  11.   

    答:只要能先判断得到S,再调用父类的super(s),这个功能好像不能实现了。。
    你说得对,若是这样,用对象初始化块是实现不了
    因为:super(...)永远是第一条语句。
    但:可以详细叙述一下你的要求,通过设计,也计可以用 静态初始化块 来解决。
      

  12.   

    答:比如:
      static  String   s= " "; 
            //构造函数 
            public   NewPeopleFunction(EJBFactory   factory)   { 
                  super(s); 
                    this.factory   =   factory; 
            }       static{ 
            if(什么==什么)//先判断一下 
            s= "aaaaaaaaaaaaaa "; 
                    else 
            s= "bbbbbbbbbbbbbb "; 
            } 

      

  13.   

    19楼的大哥,谢谢了。不过问题又来了。 刚才我的初始化块里的代码没写全,这个代码块里又调用了NewPeopleFunction 类里的一个非静态成员函数啊
    {

    什么=getFoo(args);//这里调用了一个非静态成员函数foo(args)啊
    if(什么==什么)//先判断一下
    s="aaaaaaaaaaaaaa";
    else
    s="bbbbbbbbbbbbbb";
    }
    我知道静态初始化块里是不能调用非静态成员函数的,怎么办,我是不是应该new啦,真怕又有什么新的问题出现~
      

  14.   

    答:如果getFoo(args);这个方法不是类NewPeopleFunction 和 AbstractCRMFunction 中的方法,则完全可以new 一下做。如果是上述中类中方法,必须依赖该类中方法getFoo(...)来判,则不能new 一下做,此时这个问题无解