是否可以从一个static方法内部发出对非static方法的调用?

410 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

作者的其他平台:

| CSDN:blog.csdn.net/qq_4115394…

| 掘金:juejin.cn/user/651387…

| 知乎:www.zhihu.com/people/1024…

| GitHub:github.com/JiangXia-10…

| 公众号:1024笔记

本文大概928字读完共需8分钟

这里其实问的是静态方法和非静态方法的区别:

静态方法和非静态方法的区别可以总结如下:

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方法的调用的。你学废了吗?

相关推荐: