当前位置: 代码迷 >> J2SE >> Java 静态块可否实现传参
  详细解决方案

Java 静态块可否实现传参

热度:22   发布时间:2016-04-23 20:38:52.0
Java 静态块能否实现传参?
如题,想要给静态块传递参数,整了半天没整出来,这个需求是否可行?代码如下:
public class Static {
private static String fileName;

public Static(String string) {
this.fileName = string;
}

static{
System.out.println(fileName);
}

public static void main(String[] args){
new Static("test");    //输出是null,怎么实现静态块的传参?还是根本没办法实现?
}
}

------解决方案--------------------
静态块会在main方法之前先执行的
------解决方案--------------------
引用:
Quote: 引用:

静态块又不是方法,何来参数一说

没这个搞法,思路有问题,换个思路吧

就是说Static块里面的东西都是死的是吗?


正确。
这样写吧:
public Static(String string) {
        this.fileName = string;
        init(string);
}

public static init(String string) {
       do something
}
------解决方案--------------------
静态方法也是一种静态块,何不用静态方法?
------解决方案--------------------
static{
        System.out.println(fileName);
    }

你这段代码在类加载的时候就已经执行了。类加载先行于类使用。
而你这段代码却是在类实例创建的时候执行的,static 变量的值其实赋值成功了,但是这段代码在时间顺序上是不可能早于打印语句的。因此返回永远是null。
new Static("test");


------解决方案--------------------
	static{
System.out.println(fileName);
}

static{}会在初始化一个class时优先初始化。
可以考虑使用静态方法实现楼主的要求。

------解决方案--------------------

package csdn;

public class StaticTest {

private static String filename;
StaticTest(String filename){
this.filename = filename;
}
static {
System.out.println("first");
System.out.println(filename);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("second");
new StaticTest("Hello,World");
}

}


运行结果:
first
null
second
是static块里先执行了,即使传了值也打印不出来
------解决方案--------------------
引用:
Quote: 引用:

一般来说 static块里是定义一些初始化的数据, 而这些数据是需要早于其他变量出现的。
打印为null因为,在classloader的时候先执行的静态块, 后才会走main方法的。

考虑其他的办法吧。

只能考虑其他方法了
但是例子中的“fileName”又不能写死,请问你有什么办法呢?


恩 知道其实你就是想做到不写死, 但主要还是要看你的 fileName 是干什么用的, 哪个时点用的?
而且是容器启动的时候配置呢 , 还是接收界面传参 或者 其他的情况呢?
需求描述下,不要纠结帖子的问题, 然后大家给你点点子。
------解决方案--------------------
public class Static {
    private static String fileName;
     
    public Static(String string) {
        this.fileName = string;
    }
     
    static{
         new Static("test"); // ---提前到这里试试
        System.out.println(fileName);
    }
     
    public static void main(String[] args){
          //输出是null,怎么实现静态块的传参?还是根本没办法实现?
    }
}

------解决方案--------------------
觉得楼主应该知道哪个先执行,你这段程序执行顺序是这样的
静态的先执行,然后是主函数,如果楼主明白了,就不会出现这种问题了,对吗?
------解决方案--------------------
啥也不说了。
看看我研究后的。
自己动动手就明白了。

不动手就不要说了

透析Java本质-类的初始化顺序
http://blog.csdn.net/xiaohulunb/article/details/26264841
  相关解决方案