Java中静态方法与非静态方法的区别?

Python012

Java中静态方法与非静态方法的区别?,第1张

静态方法实例方法的区别主要体现在两个方面:\x0d\x0a\x0d\x0a在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。\x0d\x0a\x0d\x0a静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。\x0d\x0a\x0d\x0a下面几个例子展示了这一区别。\x0d\x0a\x0d\x0a1、调用静态方法示例。\x0d\x0a\x0d\x0a//-----------文件名hasStaticMethod.java,程序编号1-----------------public class hasStaticMethod{//定义一个静态方法public static void callMe(){System.out.println("This is a static method.")}}\x0d\x0a \x0d\x0a下面这个程序使用两种形式来调用静态方法。\x0d\x0a//-----------文件名invokeStaticMethod.java,2-----------------public class invokeStaticMethod{public static void main(String args[]){hasStaticMethod.callMe() //不创建对象,直接调用静态方法hasStaticMethod oa = new hasStaticMethod() //创建一个对象oa.callMe() //利用对象来调用静态方法}} \x0d\x0a程序3.36两次调用静态方法,都是允许的,程序的输出如下:\x0d\x0aThis is a static method.This is a static method. \x0d\x0a\x0d\x0a允许不创建对象而调用静态方法,是Java为了减少程序员调用某些常用方法时的麻烦,而允许程序员按照传统的C语言中使用函数的方式来使用方法。典型的例子是前面某些程序中使用"Math.ramdon()"来获取随机数。\x0d\x0a\x0d\x0a2、静态方法访问成员变量示例。\x0d\x0a\x0d\x0a//-----------文件名accessMember.java,程序编号3.37-----------------class accessMember{private static int sa//定义一个静态成员变量private int ia //定义一个实例成员变量//下面定义一个静态方法static void statMethod(){int i = 0 //正确,可以有自己的局部变量sa = 10 //正确,静态方法可以使用静态变量otherStat() //正确,可以调用静态方法ia = 20 //错误,不能使用实例变量insMethod() //错误,不能调用实例方法}static void otherStat(){} //下面定义一个实例方法 void insMethod(){int i = 0 //正确,可以有自己的局部变量sa = 15 //正确,可以使用静态变量ia = 30 //正确,可以使用实例变量statMethod() //正确,可以调用静态方法}} \x0d\x0a\x0d\x0a本例其实可以概括成一句话:静态方法只能访问静态成员,实例方法可以访问静态和实例成员。之所以不允许静态方法访问实例成员变量,是因为实例成员变量是属于某个对象的,而静态方法在执行时,并不一定存在对象。同样,因为实例方法可以访问实例成员变量,如果允许静态方法调用实例方法,将间接地允许它使用实例成员变量,所以它也不能调用实例方法。基于同样的道理,静态方法中也不能使用关键字this。\x0d\x0a\x0d\x0amain()方法是一个典型的静态方法,它同样遵循一般静态方法的规则,所以它可以由系统在创建对象之前就调用。

静态方法是用来操作这个类型的,方法被该类的所有实例共享。

而实例方法用来操作单个实例,不被该类所有实例共享。

静态方法中不能调用实例方法,也不能访问实例变量。

实例方法可以调用静态方法,也能访问静态变量。

总之静态方法对应的是类型,即Class,类。但是实例方法对应的是实例,即object,对象。

静态变量

可以将静态变量理解为类变量(与对象无关),而实例变量则属于一个特定的对象。

静态变量有两种情况:

静态变量是基本数据类型,这种情况下在类的外部不必创建该类的实例就可以直接使用

静态变量是一个引用。这种情况比较特殊,主要问题是由于静态变量是一个对象的引用,那么必须初始化这个对象之后才能将引用指向它。因此如果要把一个引用定义成static的,就必须在定义的时候就对其对象进行初始化。

静态方法

与类变量不同,方法(静态方法与实例方法)在内存中只有一份,无论该类有多少个实例,都共用一个方法。

静态方法与实例方法的不同主要有:

静态方法可以直接使用,而实例方法必须在类实例化之后通过对象来调用。

在外部调用静态方法时,可以使用“类名.方法名”或者“对象名.方法名”的形式。实例方法只能使用后面这种方式。

静态方法只允许访问静态成员。而实例方法中可以访问静态成员和实例成员。

静态方法中不能使用this(因为this是与实例相关的)。