这里其实问的是静态方法和非静态方法的区别:
静态方法和非静态方法的区别可以总结如下:
1、静态方法是属于类所有,在类实例化前即可调用此方法,调用一个静态方法就是“类名.方法名”;而非静态方法是要与对象关联在一起的,必须在实例化之后才能分配内存,在实例化一个对象后,才可以在该对象上进行该方法的调用,调用就是“对象.方法()”。
2、非静态方法可以访问类中的任何成员;而静态方法只能访问类中的静态成员;
3、静态方法内部只能出现静态变量和其他静态方法,而且在静态方法中是不能使用this预定义对象引用的,即使其后边所操作的也是静态成员也不行。因为this代表的是调用这个函数的对象的引用,而静态方法是属于类的,不属于对象,静态方法成功加载的时候,对象还不一定存在;同理,super关键字也不能在静态方法中使用,因为静态优先于对象存在,所以方法被静态修饰之后方法先存在,而方法里面要用到super指向的父类对象,但是所需的父类引用对象晚于该方法出现,也就是super所指向的对象没有,当然就会出错。
4、静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁;
5、静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。静态方法与实例方法在性能和占用内存上没有很明显的区别。
栗子:
public class Demo{ public static void testStatic(){ System.out.println("This is static method"); } public void testMethod(){ System.out.println("This is instance method"); } public static void main(String[] str){ //直接通过类调用静态方法 Demo.testStatic(); //实例化,然后构造方法会初始化 Demo a = new Demo(); //对象调用非静态方法 a.testMethod(); } } 复制代码
从上面分析可以看出它们的主要区别:静态方法在创建对象前就可以使用了,非静态方法必须通过new出来的对象调用。所以当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法则没有关联的对象。所以,一个static方法内部不可以发出对非static方法的调用的。你学废了吗?