0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

静态方法不能调用非静态方法和变量的原因

汽车玩家 来源:今日头条 作者:Java的架构师技术 2020-04-12 19:36 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

这个可能很多人之前学习jvm的时候都会遇到,属于一个小问题,写这篇文章的原因是我在看java相关的面试题目中遇到的,因此顺手总结一下:

一、例子

我们先看效果:

静态方法不能调用非静态方法和变量的原因

我们在静态方法main中调用非静态变量或者是方法都会报错。我们反过来看看:

静态方法不能调用非静态方法和变量的原因

反过来没有一点问题,接下来我们解释一下原因:

二、原因解释

我们需要首先知道的是静态方法和静态变量是属于某一个类,而不属于类的对象。我们不直接讲原因,先从jvm说起:

静态方法不能调用非静态方法和变量的原因

这是一张类加载的生命周期图。

1、加载

”加载“是”类加机制”的第一个过程,在加载阶段,虚拟机主要完成三件事:

(1)通过一个类的全限定名来获取其定义的二进制字节流

(2)将这个字节流所代表的的静态存储结构转化为方法区的运行时数据结构

(3)在堆中生成一个代表这个类的Class对象,作为方法区中这些数据的访问入口。

注意此时会扫描到我们的代码中是否有静态变量或者是静态方法等等这些静态数据结构,还未分配内存。

2、验证

验证的主要作用就是确保被加载的类的正确性。

3、准备

准备阶段主要为类变量分配内存并设置初始值。这些内存都在方法区分配。注意此时就会为我们的类变量也就是静态变量分配内存,但是普通成员变量还没。

4、解析

解析阶段主要是虚拟机将常量池中的符号引用转化为直接引用的过程。

5、初始化

这是类加载机制的最后一步,在这个阶段,java程序代码才开始真正执行。我们知道,在准备阶段已经为类变量赋过一次值。在初始化阶端,程序员可以根据自己的需求来赋值了。初始化时候才会为我们的普通成员变量赋值。

写到这答案已经出来了,静态方法是属于类的,动态方法属于实例对象,在类加载的时候就会分配内存,可以 通过类名直接去访问,非静态成员(变量和方法)属于类的对象,所以只有该对象初始化之后才存在,然后通过类的对象去访问。

也就是说如果我们在静态方法中调用非静态成员变量会超前,可能会调用了一个还未初始化的变量。因此编译器会报错。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    20

    文章

    2997

    浏览量

    115652
  • 变量
    +关注

    关注

    0

    文章

    615

    浏览量

    29369
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    关于晶振的静态电容与动态电容

    静态电容与动态电容 C0与C1 的区别是什么呢?
    的头像 发表于 11-21 15:38 4092次阅读
    关于晶振的<b class='flag-5'>静态</b>电容与动态电容

    常用变量的介绍

    extern:用在全局变量上表示该变量在其他文件中已经定义;用在函数上作用同全局变量; static:用在全局变量上,和
    发表于 11-21 07:05

    求助,静态电流测试,稳态测试怎么做

    我是一名刚入职的实习生,我的嵌入式这一块的知识很欠缺,但是交给我的任务就是做一块DEMO板的静态电流测试和稳态测试,我目前有的工具如图所示,请求各位大佬教给我具体方法(最好是能有操作步骤)和思路,多谢各位了
    发表于 11-12 15:46

    飞凌嵌入式ElfBoard-Vim编辑器之静态链接和动态链接

    文件,一般是以.so文件形式存在。GCC默认是动态链接不需要加参数。举例子看一下动态链接库的使用方法,创建三个C语言文件:mymath.c、mymath.h、test.c。通过两个变量相加的方式来
    发表于 10-17 09:07

    请问RT-Thread Studio可以编译静态库(*.a)吗?

    可以在RT-Thread Studio中创建生成静态库(*.a)的工程吗?若不能可以用什么方式编译静态库吗?
    发表于 09-17 06:00

    如何正确选购功率半导体器件静态参数测试机?

    主要的功率半导体器件特性分为静态特性、动态特性、开关特性。这些测试中最基本的测试就是静态参数测试。静态参数主要是指本身固有的,与其工作条件无关的相关参数。主要包括:栅极开启电压、栅极击穿电压、源极漏
    的头像 发表于 08-05 16:06 591次阅读
    如何正确选购功率半导体器件<b class='flag-5'>静态</b>参数测试机?

    IR302静态路由配置上不生效是什么原因?需要怎么处理?

    IR302静态路由配置上不生效是什么原因?需要怎么处理?
    发表于 08-05 06:20

    动态BGP与静态BGP的区别?

    BGP(边界网关协议,Border Gateway Protocol) 是互联网中用于自治系统(AS)之间路由信息交换的核心协议。在实际部署中,BGP 可分为静态 BGP和动态 BGP两种方式,二者
    发表于 06-24 06:57

    详解ADC电路的静态仿真和动态仿真

    ADC电路主要存在静态仿真和动态仿真两类仿真,针对两种不同的仿真,我们存在不同的输入信号和不同的数据采样,因此静态仿真和动态仿真是完全不同的两个概念,所以设置的参数不同。
    的头像 发表于 06-05 10:19 1509次阅读
    详解ADC电路的<b class='flag-5'>静态</b>仿真和动态仿真

    研发排查问题的利器:一款方法调用栈跟踪工具

    作者:京东物流 郭忠强 导语 本文从日常值班问题排查痛点出发,分析方法复用的调用链路和上下文业务逻辑,通过思考分析,借助栈帧开发了一个方法调用栈的链式跟踪工具,便于展示一次请求的
    的头像 发表于 05-06 17:24 3010次阅读
    研发排查问题的利器:一款<b class='flag-5'>方法</b><b class='flag-5'>调用</b>栈跟踪工具

    DA9233高效、超低静态电流降压稳压器和超低静态电流 LDO数据手册

    DA9233 是一款高效、超低静态电流降压稳压器和超低静态电流 LDO,采用紧凑型 I2C 可配置 WLCSP 封装。降压稳压器还具有超低输出纹波(10mV)。 该器件适用于需要低纹波和高效电源
    的头像 发表于 04-08 18:07 613次阅读
    DA9233高效、超低<b class='flag-5'>静态</b>电流降压稳压器和超低<b class='flag-5'>静态</b>电流 LDO数据手册

    SiC MOSFET的静态特性

    商用的Si MOSFET耐压普遍不超过900V,而SiC拥有更高的击穿场强,在结构上可以减少芯片的厚度,从而较大幅度地降低MOSFET的通态电阻,使其耐压可以提高到几千伏甚至更高。本文带你了解其静态特性。
    的头像 发表于 03-12 15:53 1355次阅读
    SiC MOSFET的<b class='flag-5'>静态</b>特性

    无功补偿故障原因及解决方法

    无功补偿故障可能由多种原因引起,以下是一些常见的故障原因及其解决方法
    的头像 发表于 01-29 14:25 2617次阅读

    英诺达发布全新静态验证产品,提升芯片设计效率

    了重要一步,将为中国芯片产业的发展注入新的活力。 静态验证作为一种业界普遍使用的验证方法,通过对设计的源代码进行深入分析,能够发现设计中的潜在问题。与动态仿真验证和形式化验证相结合,静态验证可以显著提高验证的覆盖率,帮助设计师在
    的头像 发表于 12-24 16:53 1159次阅读

    静态路由和链路聚合的通信原理

    静态路由和链路聚合的通信原理
    发表于 12-23 16:59 10次下载