public class UseStatic {
private static int s;
public UseStatic(){
System.out.println("Create new Class");
} static {
System.out.println("static block initialized");
}
public int getStatic(){
return s;
} public void setStatic(int i){
s=i;
} public static void main(String[] args) {
UseStatic classA= new UseStatic();
UseStatic classB= new UseStatic();
System.out.println("classA.s="+classA.getStatic()+";classB.s="+classB.getStatic());
classA.setStatic(10);
System.out.println("classA.s="+classA.getStatic()+";classB.s="+classB.getStatic());
classB.setStatic(classB.getStatic()+10);
System.out.println("classA.s="+classA.getStatic()+";classB.s="+classB.getStatic());
}
}static {
System.out.println("static block initialized");
} 这是什么意思?
解决方案 »
- 这样实现翻页效果(急急急!!!)
- Hibernate如何开二级缓存?
- 如何把String类型转换成int类型?
- log4j怎么把e.printStackTrace()记录到文件
- 如何把一个String对象保存的字符串赋值到一个字符型数组里边
- servlet的doGet(), doPost(), doPut(), doDelete()是响应哪些请求的方法啊?请描述一下,谢谢
- 请问大家哪有sun的电子宠物店的源码下!
- 学过javaEE的想学习javaSE需要学哪些东西
- 关于classpath的简单问题:如何将多个jar包简单设置,而不必逐个输入在classpath中?
- 一个初学者的疑问
- 请教一个类型转换的问题?
- 哪位仁兄会javafx。请指点一下,
It's initialized before un-static variables...
}
//静态块,与静态变量初始化一样。在类的首次加载时执行。初始化顺序与代码放置的先后顺序一致。
}
//静态块,与静态变量初始化一样。在类的首次加载时执行。
//初始化用的。
//你去看看单利模式就明白了。public class Text()
{
private Text(){}; private static Text text = new Text();
public static Text getText()
{
return text;
}}
static{}还有一种
单独的代码块
{}
在构建器之前运行,
静态代码块,在Java中存在静态快static{}和非静态块{},其中静态块只有在类在第一次实例化时才会被执行,而非静态块在每次类实例化时都会执行。你的程序就是一个简单的测试而已,没有任何意义!
要说静态代码块的实际应用,在JDBC里的驱动经常用到.JDBC里加载驱动不是用Class.forName()么,当加载一个类的时候就会首先执行那个静态代码块,而JDBC的驱动就是在这个时候将自身注册的.
System.out.println("static");
}
这个是静态游离块。其执行的优先级较高,在进入main()之后,对象构建之前执行。看下面的例子:class StaticTest{
//static {
// System.out.println("statictest");
//}
static private int age;
{
System.out.println("I'm not the first freeblock in runtime.");
}
static {
System.out.println("statictest");
} public static void main(String[] args){
staticTest st = new StaticTest();}
}
{
System.out.println("I'm not the first freeblock in runtime.");
}
这里有错吧,你这里的age 有意义吗?还有那个static private 的位置是否应当换一下.
}
是静态代码块,它和静态属性一起在类创建时加载
类创建一般有4步:
1)加载静态代码块,属性,
2)预开空间
3)初始化类实例变量(非静态),语句块(普通)
4)构造函数如果有父类得话,先执行父类得每一步,在执行子类的.
第3,4两步,父类一起执行完后,执行子类的3,4两步
声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。声明为static的方法有以下几条限制:
◆它们仅能调用其他的static 方法。
◆它们只能访问static数据。
◆它们不能以任何方式引用this 或super package com.birdme;
public class UseStatic {
/**
* @param args
*/
private static int s;
public UseStatic(){
System.out.println("Create new Class");
}
static {
System.out.println("static block initialized");
}
public int getStatic(){
return s;
}
public void setStatic(int i){
s=i;
}public static void main(String[] args) {
// TODO Auto-generated method stub
UseStatic classA= new UseStatic();
UseStatic classB= new UseStatic();
System.out.println("classA.s="+classA.getStatic()+";classB.s=
"+classB.getStatic());
classA.setStatic(10);
System.out.println("classA.s="+classA.getStatic()+";classB.s=
"+classB.getStatic());
classB.setStatic(classB.getStatic()+10);
System.out.println("classA.s="+classA.getStatic()+";classB.s=
"+classB.getStatic());
}
}下面是该程序的输出:
static block initialized
Create new Class
Create new Class
classA.s=0;classB.s=0
classA.s=10;classB.s=10
classA.s=20;classB.s=20
从结果可以看出类中static块程序是在类被装载的时候开始执行。而不是在创建对象的时候执行
static private 习惯上是错的,语法上是对的。