什么是静态方法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是静态方法?相关的知识,希望对你有一定的参考价值。

什么是静态方法?什么时候用静态方法 ?

静态方法是在类中使用staitc修饰的方法,在类定义的时候已经被装载和分配。

静态方法为类所有,可以通过对象来使用,也可以通过类来使用。

我们之前一直写的mian方法仔细看看,它就是一个静态方法

使用静态方法时,要注意:

    静态方法可以调用同类中的其他成员,但不能直接调用非静态成员

    如果希望静态方法中调用非静态成员,可以通过创建类的对象 ,然后通过对象来访问非静态变量。

    静态方法同样不能直接调用非静态方法,但可以通过对象来访问非静态方法

参考技术A 静态方法是使用公共内存空间的,就是说所有对象都可以直接引用,不需要创建对象再使用该方法。
例如,我创建一个类,里面有一个静态方法:

class Test
public static int z(int xx,int yy)
return xx+yy;

public int zz(int xx,int yy)
return xx+yy;



然后在含有main方法的类中使用这个类时,对与以上非静态和静态方法的引用方式是不同的,如下:

import Test;
public class mainClass
int sum;
public static void main(String args[])

sum=Test.z(1,2); //直接用 类.方法或者属性就可以使用该方法或属性。

System.out.println(sum);
Test t=new Test();
sum=t.zz(1,2); //因为zz不是静态方法,所以只能只能用Test类创建一个t对象,然后调用该对象的方法。
System.out.println(sum);



静态方法只能被静态方法调用
希望对您有所帮助!~
参考技术B 静态方法,就是使用 static 关键字标识的方法。

比如
public class A

public static void Test()





这里的Test方法,就是静态方法。

什么时候用静态方法?

经常使用的方法,而且一上下文依赖性不强的方法。
参考技术C 在类的成员的类型或者返回值类型前面加上关键字static,就能将该成员定义为静态成员(static member).常量或类型声明会隐式地声明为静态成员,其他没有用static修饰的成员都是实例成员(instance member)或者称为非静态成员.
静态类的主要功能如下:
它们仅包含静态成员;
它们不能被实例化;
它们是密封的;
它们不能包含实例构造函数.

参考资料:http://blog.csdn.net/linoble/archive/2006/11/01/1360865.aspx

参考技术D 它们仅包含静态成员;
它们不能被实例化;
它们是密封的;
它们不能包含实例构造函数.

说的很对,是这个样子的,希望大家一起努力,在c#界中作出一些优秀的作品....
看现在的形式....java的j2ee可能要没落了.....哈哈

java中为啥说静态方法先执行?

程序执行的顺序不是按书写顺序,从上往下执行吗?

1 不管是静态方法还是非静态方法,都需要调用后执行,其执行的次序和在类里声明的次序无关,区别是静态方法是“class.method"方式执行,非静态方法是"object.method"方式执行,即后者需要创建一个对象。
2 静态成员变量(也称类变量)先于非静态成员变量初始化,静态成员变量在类第一次加载时初始化,所有对象共享一份静态成员变量,非静态成员变量则在对象创建时初始化追问

奥,再请教大侠,类一共要加载几次?

追答

只加载一次,而且是懒加载的,第一次调用该类的时候加载(比如当调用该类的静态方法或者成员变量,new一个该类的对象的时候)。
具体的说,每一个类(.class)文件,都对应着一个Class对象,这个Class对象类似于一个模板,用于创建该类的对象。这个Class对象在第一次调用该类时创建并加载到java虚拟机中。

追问

还是不理解,比如当调用该类的静态方法或者成员变量,new一个该类的对象的时候,这时候才加载?main方法要执行,首先就要把代码加载到内存啊

追答

main方法执行的时候不是一次性加载的,是需要时才加载,main方法在调用一个方法或new 一个对象的时候,会首先检查是否加载过这个类(具体地说是从jvm的内存里检查是否存在这个类的Class对象),若没有加载过,则加载这个类(即生成该类的Class对象),静态成员变量和静态代码块会在第一次加载中执行;若加载过,则不重新加载。
换个角度想想,jvm怎么知道你需要哪些类呢?只有你调用了这个类,jvm才会从类路径classpath里去找这个类(.class),然后加载它,如果当前类路径找不到,就会抛出ClassNotFoundException。
相关的详细知识,可以去看下java教材中关于类加载机制的章节。

追问

大侠,我不知道加载是什么意思,任何代码都必须是机器码然后加载到内存,才会执行的啊

追答

是的,对于java虚拟机来说,机器码就是.class文件,每个.class文件被加载,就会在内存中产生一个Class对象,这个Class对象就像一个模板,你可以理解成一个模具,所有该类的对象都会从该模具中产生。
举个例子:
public Class A
static int i = 0;
static
System.out.println("静态代码块");


public static void main(String[] args)

A.i;



main方法中调用了类A的成员变量,此时类A未被加载,那么jvm就会从classpath中找到A.class文件,然后创建A.class对象,并初始化A的静态成员变量(这里是i)和执行A的静态代码块(这里会看到print语句执行),之后无论怎么调用A,这个静态代码块都不会执行,你可以多做几次实验看看。
A.class对象,你可以通过A.class语句获得,然后通过Class.newInstance()创建A的实例,这样和new A();的语句创建效果是一样的。

追问

main方法中调用了类A的成员变量,此时类A未被加载。你的这句话我不懂,类A未被加载的话,main方法怎么会被执行?

追答

1 调用前没有加载,调用时发现Class A没有加载,遂加载之
2 main方法开始时只是启动了一个java虚拟机,除了一些必要类库,其他类都不加载,目的主要是为了速度快。

追问

这点我就不明白了,调用前没有加载的话,main方法会执行吗?相当于内存里面没有任何代码啊

追答

jvm启动只会加载必要的核心类库,其中就有Class类和相关类加载器,然后其他的类会在需要的时候加载进来。

参考技术A 我想 :类的静态初始化块在加载类时先执行,此时还没有对象产生。创建对象时构造方法和非静态初始化块按先后执行。其它方法基本上是调用才执行。也有例外。 参考技术B 静态方法没有先执行

class A
static
...



public static void a()...

public static String b()...


static
...


这类代码才会先执行

a() b()就是按照你书写的顺序执行的 啊
参考技术C 源文件和类文件你没有分清。

*.java和*.class追问

怎么这么说,请大侠指教一下

以上是关于什么是静态方法?的主要内容,如果未能解决你的问题,请参考以下文章

java中的静态方法有啥作用?

java中为啥说静态方法先执行?

在JAVA中, 静态方法和一般方法有啥区别?

java里静态方法在啥情况下使用,好处是啥

请教大家关于JAVA中的静态变量和静态方法

前面学习通过方法对代码进行改进,为什么要给方法使用静态呢?