java中静态变量和静态方法分别有什么特点?

悬赏分:0 - 解决时间:2006-4-10 10:28
 
提问者: vv_clear - 二级
最佳答案
为什么问了两次?再贴上另一篇
Thinking:Java中static用法- -
Tag: Thinking:Java中s
一、static
请先看下面这段程序:
public class Hello{
public static void main(String[] args){ //(1)
System.out.println("Hello,world!");   //(2)
}
}
看过这段程序,对于大多数学过Java 的从来说,都不陌生。即使没有学过Java,而学过其它的高级语言,例如C,那你也应该能看懂这段代码的意思。它只是简单的输出“Hello,world”,一点别的用处都没有,然而,它却展示了static关键字的主要用法。
在1处,我们定义了一个静态的方法名为main,这就意味着告诉Java编译器,我这个方法不需要创建一个此类的对象即可使用。你还得你是怎么运行这个程序吗?一般,我们都是在命令行下,打入如下的命令(加下划线为手动输入):
javac Hello.java
java Hello
Hello,world!
这就是你运行的过程,第一行用来编译Hello.java这个文件,执行完后,如果你查看当前,会发现多了一个Hello.class文件,那就是第一行产生的Java二进制字节码。第二行就是执行一个Java程序的最普遍做法。执行结果如你所料。在2中,你可能会想,为什么要这样才能输出。好,我们来分解一下这条语句。(如果没有安装Java文档,请到Sun的官方网站浏览J2SE API)首先,System是位于java.lang包中的一个核心类,如果你查看它的定义,你会发现有这样一行:public static final PrintStream out;接着在进一步,点击PrintStream这个超链接,在METHOD页面,你会看到大量定义的方法,查找println,会有这样一行:
public void println(String x)。
好了,现在你应该明白为什么我们要那样调用了,out是System的一个静态变量,所以可以直接使用,而out所属的类有一个println方法。
静态方法
通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法。如下所示:
class Simple{
static void go(){
System.out.println("Go...");
}
}
public class Cal{
public static void main(String[] args){
Simple.go();
}
}
调用一个静态方法就是“类名.方法名”,静态方法的使用很简单如上所示。一般来说,静态方法常常为应用程序中的其它类提供一些实用工具所用,在Java的类库中大量的静态方法正是出于此目的而定义的。
静态变量
静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间,当然对于final则另当别论了。看下面这段代码:
class Value{
static int c=0;
static void inc(){
c++;
}
}
class Count{
public static void prt(String s){
System.out.println(s);
}
public static void main(String[] args){
Value v1,v2;
v1=new Value();
v2=new Value();
prt("v1.c="+v1.c+"  v2.c="+v2.c);
v1.inc();
prt("v1.c="+v1.c+"  v2.c="+v2.c);
}
}
结果如下:
v1.c=0  v2.c=0
v1.c=1  v2.c=1
由此可以证明它们共享一块存储区。static变量有点类似于C中的全局变量的概念。值得探讨的是静态变量的初始化问题。我们修改上面的程序:
class Value{
static int c=0;
Value(){
c=15;
}
Value(int i){
c=i;
}
static void inc(){
c++;
}
}
class Count{
public static void prt(String s){
System.out.println(s);
}
Value v=new Value(10);
static Value v1,v2;
static{
prt("v1.c="+v1.c+"  v2.c="+v2.c);
v1=new Value(27);
prt("v1.c="+v1.c+"  v2.c="+v2.c);
v2=new Value(15);
prt("v1.c="+v1.c+"  v2.c="+v2.c);
}
public static void main(String[] args){
Count ct=new Count();
prt("ct.c="+ct.v.c);
prt("v1.c="+v1.c+"  v2.c="+v2.c);
v1.inc();
prt("v1.c="+v1.c+"  v2.c="+v2.c);
prt("ct.c="+ct.v.c);
}
}
运行结果如下:
v1.c=0  v2.c=0
v1.c=27  v2.c=27
v1.c=15  v2.c=15
ct.c=10
v1.c=10  v2.c=10
v1.c=11  v2.c=11
ct.c=11
这个程序展示了静态初始化的各种特性。如果你初次接触Java,结果可能令你吃惊。可能会对static后加大括号感到困惑。首先要告诉你的是,static定义的变量会优先于任何其它非static变量,不论其出现的顺序如何。正如在程序中所表现的,虽然v出现在v1和v2的前面,但是结果却是v1和v2的初始化在v的前面。在static{后面跟着一段代码,这是用来进行显式的静态变量初始化,这段代码只会初始化一次,且在类被第一次装载时。如果你能读懂并理解这段代码,会帮助你对static关键字的认识。在涉及到继承的时候,会先初始化父类的static变量,然后是子类的,依次类推。
通常一个普通类不允许声明为静态的,只有一个内部类才可以。这时这个声明为静态的内部类可以直接作为一个普通类来使用,而不需实例一个外部类。如下代码所示:
public class StaticCls{
public static void main(String[] args){
OuterCls.InnerCls oi=new OuterCls.InnerCls();
}
}
class OuterCls{
public static class InnerCls{
InnerCls(){
System.out.println("InnerCls");
}
}
}
输出结果会如你所料:
InnerCls
和普通类 

JAVA 静态变量与静态方法相关推荐

  1. Java静态变量与静态方法与成员变量成员方法的区别

    java变量分为实例变量和静态变量方法分为实例方法和静态方法 如 class Example{ int data;//定义实例变量,也叫成员变量 public void method(){     / ...

  2. Java 静态变量和静态方法

    在类中,使用 static 修饰符修饰的属性(成员变量)称为静态变量,也可以称为类变量,常量称为静态常量,方法称为静态方法或类方法,它们统称为静态成员,归整个类所有. 静态成员不依赖于类的特定实例,被 ...

  3. java静态变量、静态方法、代码块、main方法

    文章目录 一.类变量 / 静态变量(static) 二.类方法 / 静态方法(static) 三.main方法 四.代码块 (一)static代码块 (二)普通代码块 五.属性初始化.代码块.构造器的 ...

  4. JAVA 静态变量,静态方法,main方法详解(韩顺平)

    目录 一.类变量 1.类变量的引入 2.类变量的定义 3.类变量的特点 4.如何定义类变量 5.如何访问类变量 6.类变量使用细节 二.类方法 1.基本介绍 2.定义类方法 3.类方法的访问 4.类方 ...

  5. Java 静态变量,静态方法,静态常量(java static 关键字)

    Java 静态变量,静态方法,静态常量  就是变量 ,方法,常量前面添加了static 关键字 为什么要使用静态的呢 有时候在处理问题时会需要两个类在同一个内存区域共享一个数据, 不如现在 Main ...

  6. java中静态变量和静态方法分别有什么特点?

    java中静态变量和静态方法分别有什么特点? 悬赏分:0 - 解决时间:2006-4-10 10:28 提问者: vv_clear - 二级 最佳答案 为什么问了两次?再贴上另一篇 Thinking: ...

  7. java学习笔记(四)----对象、数组作为参数传递,静态变量、静态方法的使用,内部类,使用文档注释

    ***对象作为参数传递*** class passparam { int x;   public static void main(String[] args)   { passparam obj = ...

  8. JAVA的静态变量、静态方法、静态类

    静态变量和静态方法都属于静态对象,它与非静态对象的差别需要做个说明. (1)Java静态对象和非静态对象有什么区别? 比对如下: 静态对象                                ...

  9. java 静态类 静态方法_JAVA的静态变量、静态方法、静态类

    静态变量和静态方法都属于静态对象,它与非静态对象的差别需要做个说明. (1)Java静态对象和非静态对象有什么区别? 比对如下: 静态对象                                ...

最新文章

  1. 禅道 php api,禅道 Rest API 开发
  2. python分析nginx日志
  3. windows下面sublime无法粘贴复制的问题解决(转)
  4. python 函数可以作为容器对象的元素_python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义...
  5. 网站压力测试软件(Apache JMeter)2.13 官方版 Error: Unable to access jarfile ApacheJMeter.jar
  6. mysql内连接部门平均值_详解MySql基本查询、连接查询、子查询、正则表达查询_MySQL...
  7. Java7并发编程指南——第四章:线程执行器
  8. JQgrid for asp.net 不完全手记
  9. node 版本管理器 之 nvm 安装与使用
  10. Python代码实现验证码识别
  11. VC编程助手_VC Assist(内附VC显示行号) VC插件
  12. ai背景合成_AI突破次元壁又火了!《飞屋环游记》动漫角色一秒变真人,网友:小罗的“猫王发型”有点酷...
  13. DXperience的汉化步骤,相当简单
  14. 浅谈人工智能:现状、任务、构架与统一
  15. Linux文件权限查看与修改
  16. enq: HW - contention
  17. 工作室机房干扰问题怎样解决?
  18. office打开不了服务器文件,Office常见打开问题及解决 -电脑资料
  19. 在线客服系统源码-在线客服php源码下载-新版网站客服系统-搭建教程-无限坐席
  20. 转载 中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030

热门文章

  1. 拟合一条曲线_毕业季:6 款曲线,解决 99% 的 ELISA 数据拟合难题
  2. 积跬步以至千里_积跬步以至千里,聚小利终成大户
  3. c++ string 拼接_String类5个常见面试题的解答过程和原理
  4. 200 switching to ascii mode_王者荣耀:小伙200买V8号,146款皮肤还有1神秘道具,一封邮件哭了...
  5. linux /dev/snd,linux – / dev / tcp去了哪里?
  6. Vmo前端数据模型设计
  7. C# 操作Excel之旁门左道 [ C# | Excel ]
  8. Theano 中文文档 0.9 - 7.2.5 循环
  9. nginx日志通过rsyslog传入到日志服务器指定目录
  10. char[1] or char*