Java中静态方法和非静态方法互相调用出现的问题分析?

静态方法在程序编译的时候就已经执行了,而非静态方法必须实例化对象的时候才能被启用,相当于执行静态方法时非静态方法还未执行,因此是错误的;

那么非静态方法中调用静态方法,是不会报错的。在普通成员方法中调用了`Arrays.sort(a);`,查看了源码发现`Arrays`的排序算法是静态的。

为什么出错呢?是因为我在类里面调用了静态方法。类中应该只可以定义成员变量和方法吧,不能写语句,语句必须放在方法中!

因为这个问题,我边描述边解决了,因此不需要回答,打扰了~

 

如果有对Java和这里相关问题有讨论的朋友,希望可以评论

很赞赏题主的思考能力,能够主动地思考问题,但是明显感觉题主对于Java的深度了解不够,了解静态方法和实例方法最好的方法是去看JVM

 

建议楼主了解以下的知识点

1. JVM 中类加载的过程,尤其是初始化阶段干了啥事  推荐: https://www.zhoutao123.com/page/book/jvm/category/rfvpgg?bookId=1

2. 了解字节码角度了解下文件中静态方法和实例方法的区别

3.  了解下Java方法栈中栈帧的结构以及其作用 推荐: https://www.zhoutao123.com/page/book/jvm/category/myp18l?bookId=1

-----

1. 静态方法在程序编译的时候就已经执行了?

WTF, 静态方法明明是被调用的时候执行的,啥时候在编译的时候就执行了? 题目的意思应该是静态代码块吧,就算是静态代码块,也应该是在<cinit>方法中被调用执行(<cinit>方法是初始化过程由JVM自动搜集静态变量和静态代码块生成的一个特殊的方法),而不是编译的时候,编译只是生成字节码文件!!! 

 

 

2. 相当于执行静态方法时非静态方法还未执行 ?

静态方法和非静态方法在字节码中等级是一样的,没有先后之分,只看调用的先后之分,应该是 静态代码块 被<cinit> 方法调用执行。

 

3. 类中应该只可以定义成员变量和方法吧,不能写语句,语句必须放在方法中! ???

那么题主解释下,下面的代码是放在方法里面的吗

public class StaticCode {

  private static final String name;

  // 这块代码是放在方法里面的吗
  static {
    name = "123";
  }
}

 

楼主是在学习初期吧

建议先快速学完知识,达到会用即可,然后再回头看原理,一开始就深入的原理源码中,只会浪费时间

举个例子:

你的笔记本电脑刚买回来的时候,你是迫不及待的把它拆了研究零件芯片,还是先开机熟悉如何使用呢?当你用电脑时间久了,再让你去拆电脑,是不是会有些底气了?