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

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

3天内不再提示

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

汽车玩家 来源:今日头条 作者:Java的架构师技术 2020-04-12 19:36 次阅读

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

一、例子

我们先看效果:

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

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

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

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

二、原因解释

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

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

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

1、加载

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

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

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

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

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

2、验证

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

3、准备

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

4、解析

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

5、初始化

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

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

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

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

    关注

    19

    文章

    2953

    浏览量

    104504
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28314
收藏 人收藏

    评论

    相关推荐

    TPA3116静态功耗静态电流比较大是什么原因导致的?

    关于TPA3116静态功耗大,在TI的论坛里面发现几乎所有的电感发热都是说是因为输出LC电路导致 1,想问一下这个静态功耗静态电流比较大是什么原因导致的? 2,除了LC电路会导致,
    发表于 10-12 08:35

    一种半动态环境中的定位方法

    静态环境中进行地图绘制和定位是机器人学的基本问题。之前的方法大多关注静态和高度动态的物体,但在半动态环境中,如果不考虑低动态物体(如停放的汽车和行人),可能会导致定位失败。我们提出
    的头像 发表于 09-30 14:40 189次阅读
    一种半动态环境中的定位<b class='flag-5'>方法</b>

    手机静态独享ip搭建方法,是如何操作的?

    手机静态独享IP的搭建主要涉及到选择一个可靠的代理服务提供商,并从该服务商处获取静态独享IP地址及其配置信息,然后在手机上进行相应的网络设置。
    的头像 发表于 09-13 09:41 296次阅读
    手机<b class='flag-5'>静态</b>独享ip搭建<b class='flag-5'>方法</b>,是如何操作的?

    嵌入式学习-静态链接和动态链接

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

    静态链接和动态链接

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

    放大电路静态工作点不稳定的原因

    以下是关于放大电路静态工作点不稳定原因的分析: 引言 放大电路是电子系统中的关键组成部分,其主要功能是接收输入信号并将其转换为更大的电流或电压信号。然而,放大电路的静态工作点(Q点)稳定性对于电路
    的头像 发表于 08-06 15:36 826次阅读

    请问静态变量如何放到flash中?

    比如有有很多的静态变量,如何防到flash中。 我用了const修饰,编译出来,但是还是在rodate段,该段不是在80k的ram中吗?
    发表于 07-12 09:26

    静态库中定义的INIT_DEVICE_EXPORT函数并没有被系统调用,为什么?

    1,将一段代码编译成静态库 2,主工程链接这个静态库 3,静态库里的函数并没有被主工程调用 4,静态库中定义了一些 INIT_DEVICE_
    发表于 07-04 06:49

    请问ESP-IDF v4.1怎么生成静态库和调用静态库?

    ESP-IDF v4.1怎么生成静态库和调用静态
    发表于 06-24 09:00

    如何设置静态IP代理

    静态IP
    jf_60146132
    发布于 :2024年04月29日 07:46:31

    常用的变频器检测方法静态测试和动态测试

    常用的变频器检测方法静态测试和动态测试  变频器是一种电力调节装置,可以实现对电动机的调速和节能。在使用变频器时,经常需要对其进行检测,以确保其正常工作。常用的变频器检测方法主要包括静态
    的头像 发表于 02-01 15:47 4249次阅读

    静态电流什么意思 静态电流和动态电流的区别

    静态电流什么意思 静态电流和动态电流的区别  静态电流是指电荷在不发生移动的情况下所产生的电流。在静电场中,电荷通过金属导线或其他连续的导电体产生静态电流的流动。
    的头像 发表于 12-19 14:02 2290次阅读

    this可以出现在类方法中吗

    用 this 关键字时,编译器会发出错误提示,因为类方法静态方法,没有与它们关联的特定对象实例。然而,在特定情况下,我们可以使用 this 关键字在类方法中引用当前对象。 一种情况
    的头像 发表于 11-28 16:24 1293次阅读

    无线网IP静态好还是DHCP好

    静态IP和动态主机配置协议(DHCP)是两种不同的IP地址分配方法。每种方法都有其优点和适用场景,选择哪种方法取决于您的具体需求和网络环境。下面将详细介绍
    的头像 发表于 11-27 15:03 1.7w次阅读

    linux修改静态ip地址方法

    在Linux系统中修改静态IP地址可以通过多种方式实现。在本文中,我们将介绍两种常见的方法:命令行方式和配置文件方式。无论你是初学者还是有经验的Linux用户,本文都将向你展示如何使用这两种方法
    的头像 发表于 11-17 10:36 5756次阅读