首页编程java编程java静态变量有什么特点?JAVA中静态变量成员有什么特点简单点说 初学者

java静态变量有什么特点?JAVA中静态变量成员有什么特点简单点说 初学者

编程之家2023-10-1296次浏览

各位老铁们好,相信很多人对java静态变量有什么特点都不是特别的了解,因此呢,今天就来为大家分享下关于java静态变量有什么特点以及JAVA中静态变量成员有什么特点简单点说 初学者的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

java静态变量有什么特点?JAVA中静态变量成员有什么特点简单点说 初学者

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

为什么问了两次?再贴上另一篇

Thinking:Java中static用法--

Tag: Thinking:Java中s

java静态变量有什么特点?JAVA中静态变量成员有什么特点简单点说 初学者

一、static

请先看下面这段程序:

public class Hello{

java静态变量有什么特点?JAVA中静态变量成员有什么特点简单点说 初学者

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.特点一:静态变量的值是共享。比如说A类中有个静态变量V_A,A类创建了两个实例a,b。如果给实例a的变量V_A赋值,如a.V_A=1。那么这时候查看实例b的V_A变量的值也为1,也就是说A对象实例化的两个类共享同一个变量值,而且静态变量

2.特点二:不需要对象实例化就可以使用。比如A类中的静态变量V_A可以用A.V_A的形式使用

静态变量的变量特点

静态局部变量属于静态存储方式,它具有以下特点:

(1)静态局部变量在函数内定义,但不像自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。

(2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。

(3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值0,字符型变量赋空字符。

(4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。根据静态局部变量的特点,可以看出它是一种生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。给读者一个简单直白的例子(区别静态局部变量和动态局部变量):#include<stdio.h>intfun(intn){staticintf=1;f=f*n;returnf;}voidmain(){inti;for(i=1;i<=5;i++)printf(fun(%d)=%d\n,i,fun(i));}这里的运行结果是: fun(1)=1fun(2)=2fun(3)=6fun(4)=24fun(5)=120说明f在加了static的类型限制之后,就相当于全局变量,函数调用完了之后,修改过的f的值仍然是有效的(即这个程序相当于求i的阶乘了)。而如果不加static的类型限制,那么,会是什么结果呢,我们看下面的代码:#include<stdio.h>intfun(intn){intf=1;f=f*n;returnf;}voidmain(){inti;for(i=1;i<=5;i++)printf(fun(%d)=%d\n,i,fun(i));}程序的运行结果是: fun(1)=1fun(2)=2fun(3)=3fun(4)=4fun(5)=5也就是说,这时函数fun中的变量f的生命周期就仅限于fun函数的范围内了,在main中每次传入新的参数i,f就会计算1*i的值并返回,而不会像之前那样不断的累乘了。

———————————————————————————————————————————————

下面是java例子: publicclassStaticTest{staticintf=1;//java声明静态变量要放到函数外面,结果和c的结果一样intfun(intn){f=f*n;returnf;}publicstaticvoidmain(String[]args){StaticTestst=newStaticTest();for(inti=1;i<=5;i++)System.out.println(st.fun(i));}}---------------------------------------------------------------------------------------------------------------

Module Module1

Public a As Integer‘未赋值的情况下a的值是0

End Module

Public Class Form1

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

a+= 1

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

a+= 1

MsgBox(a)’结果是2(0+1+1)因为是a是模块级静态全局变量,所以按按钮3以后,直到关闭程序a的值都会是2

End Sub

End Class

好了,文章到这里就结束啦,如果本次分享的java静态变量有什么特点和JAVA中静态变量成员有什么特点简单点说 初学者问题对您有所帮助,还望关注下本站哦!

什么是java反编译?什么是Java代码的编译与反编译attack什么意思