关于Static关键字的几个问题

噢不 2009-10-20 12:04:27
class Test{
static int i = 5;
static{ //这个static是干嘛的。 有什么用。
System.out.println("output=" + i++);
}
}

public class TestStatic{
public static void main(String[] args){
System.out.println("output:i=" + Test.i);
}
}
“static方法不能访问与他本身的参数以及static变量分离的任何变量”这句话是什么意思?
...全文
132 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigbro001 2009-10-20
  • 打赏
  • 举报
回复
首先帮楼主重新排个版:

class Test
{
static int i = 5;
static
{
//这个static是干嘛的。 有什么用。
System.out.println("output=" + i++);
}
}
public class TestStatic
{
public static void main(String[] args)
{
System.out.println("output:i=" + Test.i);
}
}

代码中标注的那个块叫做“静态初始化块”,当JVM加载该类的时候,就执行静态初始化块中的语句

“static方法不能访问与他本身的参数以及static变量分离的任何变量”这句话是什么意思?

因为static方法不需它所属的类的任何实例就可以被调用,因此没有this值,static方法访问非静态变量的尝试会引起编译错误
tsguoheng86 2009-10-20
  • 打赏
  • 举报
回复
这个的作用相当于你写一个默认的构造函数,只要你加载这个类,就会加载这个static静态块中的代码,放在内存中。
hejian6462 2009-10-20
  • 打赏
  • 举报
回复
类加载的时候 会先加载静态语句块的内容
static修饰的语句块里不能用非static修饰的变量
healer_kx 2009-10-20
  • 打赏
  • 举报
回复
传说中的静态块,相当于C#的静态构造函数,表示这个类而非对象初始化要走的流程。
bigbro001 2009-10-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 acrush7 的回复:]
为什么在我commment out System.out.println("output:i=" + Test.i);,连static模块里面的也没有打印了?

[/Quote]

main方法中,当线程看到打印语句中的Test.i时,此时用到了Test类,于是JVM加载Test类,Test类的静态块中语句开始执行,然后再回到刚才的打印语句中打印出来output:i=6
如果comment掉那个打印语句,整个程序中都没有用到Test类,JVM也就不会加载Test类了
  • 打赏
  • 举报
回复
静态块,实例化对象以后首先执行静态块
cwjieNo1 2009-10-20
  • 打赏
  • 举报
回复
当程序运行的时候,JVM会首先将静态初始化块加载到内存中,static修饰的变量是静态变量也叫类变量,它的调用直接可以是类名来直接调用,静态块中访问的变量不能是非静态初始化块的,只能是静态变量或者类变量·
lk198186 2009-10-20
  • 打赏
  • 举报
回复
up
cz61919345 2009-10-20
  • 打赏
  • 举报
回复
static修饰的变量是静态变量也叫类变量,类变量中不能调用实例变量和实例方法,因为类变量jvm加载的,
它调用的时候可以直接用类名.X来调用,不用this!
liuyi1985_2008 2009-10-20
  • 打赏
  • 举报
回复
类加载的时候 会先加载静态语句块的内容
static修饰的语句块里不能用非static修饰的变量
acRush7 2009-10-20
  • 打赏
  • 举报
回复
为什么在我commment out System.out.println("output:i=" + Test.i);,连static模块里面的也没有打印了?

62,621

社区成员

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

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