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

    文章

    2904

    浏览量

    102995
  • 变量
    +关注

    关注

    0

    文章

    596

    浏览量

    28112
收藏 人收藏

    评论

    相关推荐

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

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

    this可以出现在类方法中吗

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

    无线网IP静态好还是DHCP好

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

    linux修改静态ip地址方法

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

    Python中普通方法静态方法、类方法的区别

    静态方法,和普通的函数没有什么区别 下面将聊聊实际项目中几种应用场景 1、要调用一个静态方法,一般使用形式是:「 类名.
    的头像 发表于 11-02 11:03 248次阅读

    为什么Main方法里可以调用println()方法 ?

    public static void main(String[] args) {System.out.println(\"xxxxxxxxxx\"); } } 我记得静态方法不能调用
    发表于 10-25 07:02

    在单片机程序里频繁读写的变量放在全局或静态局部变量会更好吗?

    看看我的理解对不对 1.全局变量 静态局部变量 栈 堆 全都会放在RAM中 2.函数 uint32_t fun(uint32_t arg){ static uint32_t i
    发表于 10-16 08:05

    CompletableFuture的静态方法使用

    1 CompletableFuture的静态方法使用 CompleteableFuture的静态方法有如下 之前的文章里面已经讲过suuplyAsync,以及runAsync。我们就直
    的头像 发表于 10-10 14:07 358次阅读
    CompletableFuture的<b class='flag-5'>静态</b><b class='flag-5'>方法</b>使用

    静态代码块、构造代码块、构造函数及普通代码块的执行顺序

    在Java中,静态代码块、构造代码块、构造函数、普通代码块的执行顺序是一个笔试的考点,通过这篇文章希望大家能彻底了解它们之间的执行顺序。 1、静态代码块 ①、格式 在java类中(方法不能
    的头像 发表于 10-09 15:40 434次阅读
    <b class='flag-5'>静态</b>代码块、构造代码块、构造函数及普通代码块的执行顺序

    UVM中通过静态类实现对全局资源实现管理

    Systemverilog中可以使用static修饰变量方法,得到静态变量静态函数。static也可以直接修饰class,获得静态类。但
    的头像 发表于 08-07 17:35 1107次阅读
    UVM中通过<b class='flag-5'>静态</b>类实现对全局资源实现管理

    什么是静态代码分析?静态代码分析概述

    静态分析可帮助面临压力的开发团队。高质量的版本需要按时交付。需要满足编码和合规性标准。错误不是一种选择。 这就是开发团队使用静态分析工具/源代码分析工具的原因。在这里,我们将讨论静态
    的头像 发表于 07-19 12:09 928次阅读
    什么是<b class='flag-5'>静态</b>代码分析?<b class='flag-5'>静态</b>代码分析概述

    数码管的静态、动态显示原理及编程方法(2)

    “掌握数码管的静态、动态显示原理及编程方法。--综合案例”
    的头像 发表于 06-28 11:41 1005次阅读
    数码管的<b class='flag-5'>静态</b>、动态显示原理及编程<b class='flag-5'>方法</b>(2)

    数码管的静态、动态显示原理及编程方法(1)

    “掌握数码管的静态、动态显示原理及编程方法。--不是综合案例”
    的头像 发表于 06-28 11:40 968次阅读
    数码管的<b class='flag-5'>静态</b>、动态显示原理及编程<b class='flag-5'>方法</b>(1)

    静态时序分析的基本概念和方法

    向量和动态仿真 。本文将介绍静态时序分析的基本概念和方法,包括时序约束,时序路径,时序裕量,setup检查和hold检查等。 时序路径 同步电路设计中,时序是一个主要的考虑因素,它影响了电路的性能和功能。为了验证电路是否能在最
    的头像 发表于 06-28 09:38 806次阅读
    <b class='flag-5'>静态</b>时序分析的基本概念和<b class='flag-5'>方法</b>

    static的全局变量与局部变量的使用,看完你就懂了

    在本文件中调用不能被其他文件调用。static 修饰的变量存放在全局数据区的静态变量区,包括全局静态变
    发表于 06-27 08:54