Java 静态块能否实现传参?

Gaken 2014-06-10 04:47:48
如题,想要给静态块传递参数,整了半天没整出来,这个需求是否可行?代码如下:
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,怎么实现静态块的传参?还是根本没办法实现?
}
}
...全文
851 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gaken 2014-06-12
  • 打赏
  • 举报
回复
问题已解决,多谢大家的解答与帮助,再次感谢!
Gaken 2014-06-12
  • 打赏
  • 举报
回复
引用 29 楼 u011278496 的回复:
啥也不说了。 看看我研究后的。 自己动动手就明白了。 不动手就不要说了 透析Java本质-类的初始化顺序 http://blog.csdn.net/xiaohulunb/article/details/26264841
Gaken 2014-06-11
  • 打赏
  • 举报
回复
引用 17 楼 szq80140 的回复:

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块里先执行了,即使传了值也打印不出来
学习了,谢谢!
Gaken 2014-06-11
  • 打赏
  • 举报
回复
引用 12 楼 oh_Maxy 的回复:
静态方法也是一种静态块,何不用静态方法?
嗯,最后还是选择用静态方法,静态块是别人写的,起初是不想改动太大,所以才问这个问题
之奇一昂 2014-06-11
  • 打赏
  • 举报
回复

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块里先执行了,即使传了值也打印不出来
Gaken 2014-06-11
  • 打赏
  • 举报
回复
引用 15 楼 shine333 的回复:
[quote=引用 11 楼 lin9118 的回复:] [quote=引用 8 楼 shine333 的回复:] 话说,你能帮你的父母接生吗??
看了一下你给别人的回答,你老牛逼了,我估计是遗传你妈的[/quote] 再牛,也比你口吐污言秽语强
http://blog.csdn.net/shine333/article/details/65854#comment_item_3945635
[/quote] 您好像很文明你样子
shine333 2014-06-11
  • 打赏
  • 举报
回复
引用 11 楼 lin9118 的回复:
[quote=引用 8 楼 shine333 的回复:] 话说,你能帮你的父母接生吗??
看了一下你给别人的回答,你老牛逼了,我估计是遗传你妈的[/quote] 再牛,也比你口吐污言秽语强
http://blog.csdn.net/shine333/article/details/65854#comment_item_3945635
xlight2023 2014-06-11
  • 打赏
  • 举报
回复
	static{
		System.out.println(fileName);
	}
static{}会在初始化一个class时优先初始化。 可以考虑使用静态方法实现楼主的要求。
Yoara 2014-06-11
  • 打赏
  • 举报
回复
static{
        System.out.println(fileName);
    }
你这段代码在类加载的时候就已经执行了。类加载先行于类使用。 而你这段代码却是在类实例创建的时候执行的,static 变量的值其实赋值成功了,但是这段代码在时间顺序上是不可能早于打印语句的。因此返回永远是null。
new Static("test");
oh_Maxy 2014-06-11
  • 打赏
  • 举报
回复
静态方法也是一种静态块,何不用静态方法?
Gaken 2014-06-11
  • 打赏
  • 举报
回复
引用 8 楼 shine333 的回复:
话说,你能帮你的父母接生吗??
看了一下你给别人的回答,你老牛逼了,我估计是遗传你妈的
Gaken 2014-06-11
  • 打赏
  • 举报
回复
引用 6 楼 ygycomon 的回复:
[quote=引用 5 楼 lin9118 的回复:] [quote=引用 3 楼 ygycomon 的回复:] 静态块又不是方法,何来参数一说 没这个搞法,思路有问题,换个思路吧
就是说Static块里面的东西都是死的是吗?[/quote] 正确。 这样写吧: public Static(String string) { this.fileName = string; init(string); } public static init(String string) { do something }[/quote] 谢谢
Gaken 2014-06-11
  • 打赏
  • 举报
回复
引用 8 楼 shine333 的回复:
话说,你能帮你的父母接生吗??
我能肯定我能帮你父母接生
2.wa 2014-06-11
  • 打赏
  • 举报
回复
啥也不说了。 看看我研究后的。 自己动动手就明白了。 不动手就不要说了 透析Java本质-类的初始化顺序 http://blog.csdn.net/xiaohulunb/article/details/26264841
满无解 2014-06-11
  • 打赏
  • 举报
回复
引用 27 楼 lin9118 的回复:
[quote=引用 26 楼 u012002376 的回复:] 觉得楼主应该知道哪个先执行,你这段程序执行顺序是这样的 静态的先执行,然后是主函数,如果楼主明白了,就不会出现这种问题了,对吗?
说得对,还没学到家,呵呵!问题已解决,谢谢[/quote] 同为小菜,共勉咯,
Gaken 2014-06-11
  • 打赏
  • 举报
回复
引用 26 楼 u012002376 的回复:
觉得楼主应该知道哪个先执行,你这段程序执行顺序是这样的 静态的先执行,然后是主函数,如果楼主明白了,就不会出现这种问题了,对吗?
说得对,还没学到家,呵呵!问题已解决,谢谢
满无解 2014-06-11
  • 打赏
  • 举报
回复
觉得楼主应该知道哪个先执行,你这段程序执行顺序是这样的 静态的先执行,然后是主函数,如果楼主明白了,就不会出现这种问题了,对吗?
Gaken 2014-06-11
  • 打赏
  • 举报
回复
引用 21 楼 fatg1988 的回复:
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,怎么实现静态块的传参?还是根本没办法实现?
    }
}
这样可以实现输出不是null,但是还是没办法实现不写死的需求,所以我认为只能放弃静态块,不管怎么样,谢谢你的解答!
大头叶 2014-06-11
  • 打赏
  • 举报
回复
引用 13 楼 Yoara 的回复:
static{
        System.out.println(fileName);
    }
你这段代码在类加载的时候就已经执行了。类加载先行于类使用。 而你这段代码却是在类实例创建的时候执行的,static 变量的值其实赋值成功了,但是这段代码在时间顺序上是不可能早于打印语句的。因此返回永远是null。
new Static("test");
我觉得这个事正解!
Gaken 2014-06-11
  • 打赏
  • 举报
回复
引用 20 楼 haohaodigua 的回复:
[quote=引用 4 楼 lin9118 的回复:] [quote=引用 2 楼 haohaodigua 的回复:] 一般来说 static块里是定义一些初始化的数据, 而这些数据是需要早于其他变量出现的。 打印为null因为,在classloader的时候先执行的静态块, 后才会走main方法的。 考虑其他的办法吧。
只能考虑其他方法了 但是例子中的“fileName”又不能写死,请问你有什么办法呢?[/quote] 恩 知道其实你就是想做到不写死, 但主要还是要看你的 fileName 是干什么用的, 哪个时点用的? 而且是容器启动的时候配置呢 , 还是接收界面传参 或者 其他的情况呢? 需求描述下,不要纠结帖子的问题, 然后大家给你点点子。[/quote] fileName实际上就是一个字符串,这个字符串是根据数据库里面的内容动态指定的,例如这个字符串是个文件名,假设对应的文件是个配置文件,当不同的用户登录时载入相对应的配置文件。在数据库里头,a用户对应的配置文件是file1。大概就是这样的,不知道有没有描述清楚。 另外,谢谢!
加载更多回复(11)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧