静态方法在程序编译的时候就已经执行了,而非静态方法必须实例化对象的时候才能被启用,相当于执行静态方法时非静态方法还未执行,因此是错误的;
那么非静态方法中调用静态方法,是不会报错的。在普通成员方法中调用了`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";
}
}
楼主是在学习初期吧
建议先快速学完知识,达到会用即可,然后再回头看原理,一开始就深入的原理源码中,只会浪费时间
举个例子:
你的笔记本电脑刚买回来的时候,你是迫不及待的把它拆了研究零件芯片,还是先开机熟悉如何使用呢?当你用电脑时间久了,再让你去拆电脑,是不是会有些底气了?