小卜妞~ 2021-03-31 16:25 采纳率: 0%
浏览 31

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

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

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

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

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

 

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

  • 写回答

2条回答 默认 最新

  • 燕归来兮_ 2021-03-31 16:50
    关注

    很赞赏题主的思考能力,能够主动地思考问题,但是明显感觉题主对于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";
      }
    }
    评论

报告相同问题?

悬赏问题

  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表