@value 静态变量_面试官:为什么静态方法不能调用非静态方法和变量?
这个可能很多人之前学习jvm的时候都会遇到,属于一个小问题,写这篇文章的原因是我在看java相关的面试题目中遇到的,因此顺手总结一下:
一、例子
我们先看效果:
我们在静态方法main中调用非静态变量或者是方法都会报错。我们反过来看看:
反过来没有一点问题,接下来我们解释一下原因:
二、原因解释
我们需要首先知道的是静态方法和静态变量是属于某一个类,而不属于类的对象。我们不直接讲原因,先从jvm说起:
这是一张类加载的生命周期图。
1、加载
”加载“是”类加机制”的第一个过程,在加载阶段,虚拟机主要完成三件事:
(1)通过一个类的全限定名来获取其定义的二进制字节流
(2)将这个字节流所代表的的静态存储结构转化为方法区的运行时数据结构
(3)在堆中生成一个代表这个类的Class对象,作为方法区中这些数据的访问入口。
注意此时会扫描到我们的代码中是否有静态变量或者是静态方法等等这些静态数据结构,还未分配内存。
2、验证
验证的主要作用就是确保被加载的类的正确性。
3、准备
准备阶段主要为类变量分配内存并设置初始值。这些内存都在方法区分配。注意此时就会为我们的类变量也就是静态变量分配内存,但是普通成员变量还没。
4、解析
解析阶段主要是虚拟机将常量池中的符号引用转化为直接引用的过程。
5、初始化
这是类加载机制的最后一步,在这个阶段,java程序代码才开始真正执行。我们知道,在准备阶段已经为类变量赋过一次值。在初始化阶端,程序员可以根据自己的需求来赋值了。初始化时候才会为我们的普通成员变量赋值。
写到这答案已经出来了,静态方法是属于类的,动态方法属于实例对象,在类加载的时候就会分配内存,可以 通过类名直接去访问,非静态成员(变量和方法)属于类的对象,所以只有该对象初始化之后才存在,然后通过类的对象去访问。
也就是说如果我们在静态方法中调用非静态成员变量会超前,可能会调用了一个还未初始化的变量。因此编译器会报错。
@value 静态变量_面试官:为什么静态方法不能调用非静态方法和变量?相关推荐
- 静态方法不能调用非静态方法的原因
静态方法是属于类的,即静态方法是随着类的加载而加载的,在加载类时,程序就会为静态方法分配内存,而非静态方法是属于对象的,对象是在类加载之后创建的,也就是说静态方法先于对象存在,当你创建一个对象时,程序 ...
- java 静态方法 调用非静态方法_面试官:为什么java中静态方法不能调用非静态方法或变量?...
这个可能很多人之前学习jvm的时候都会遇到,属于一个小问题,写这篇文章的原因是我在看java相关的面试题目中遇到的,因此顺手总结一下: 一.例子 我们先看效果: 我们在静态方法main中调用非静态变量 ...
- php类如何变为静态调用,PHP类中静态方法如何调用非静态方法?_后端开发
php如何将字符串转成json_后端开发 php将字符串转成json的方法是:可以通过json_encode()函数来实现.json_encode()函数用于对变量进行JSON编码,该函数如果执行成功 ...
- synchronized不能锁静态变量_面试官:请说一下对象锁和类锁的区别
有锁才有自由 生活中不存在绝对的自由,绝对的自由通常对应的无序和混沌,只有在道德.法律.伦理的约束下的相对自由,才能使人感受到自由. 而在多线程编程中,锁是至关重要的,锁就是道德,就是法律约束,没有锁 ...
- java 静态调用非静态方法_java中静态方法中调用非静态方法的详解
首先static的成员是在类加载的时候初始化的,JVM的CLASSLOADER的加载,首次主动使用加载,而非static的成员是在建立对象的时候,即new 操做的时候才初始化的:函数 前后顺序是先加载 ...
- 静态方法中调用非静态方法
我们都知道,静态static方法中不能调用非静态non-static方法,准确地说是不能直接调用non-static方法.但是可以通过将一个对象的引用传入static方法中,再去调用该对象的non-s ...
- java中静态方法中调用非静态方法的详解
静态static方法中不能调用非静态(non-static)方法,准确地说是不能直接调用non-static方法.但是可以通过将一个对象的引用传入static方法中,再去调用该对象的non-stati ...
- static静态方法(1)——c#静态方法怎么调用非静态方法
一般情况下Sta()是不能调用NoSta()的,但是可以通过增加一个静态成员来调用. class B {private static B instance=new B();public static ...
- php静态方法调用变量吗,php静态方法怎么调用非静态变量?
php中,静态方法可以使用self关键词来调用非静态变量,例"self::$name":一个方法被"self::"后,它就自动转变为静态方法.注:静态方法不能调 ...
最新文章
- vi vim常用命令
- PHP sprintf() 函数
- python工程师-如何面试Python后端工程师?
- HTML5 跨文档消息传输
- 决策树(Decision Tree)和随机森林
- 【必看】做了3年运维却不涨薪?那是你还没get这个技能
- git服务器的简单搭建
- mysql教程目录_MySql目录(二)
- 算法的概念与伪代码的使用
- 【C++ Primer】第五章学习笔记(循环和关系表达式)
- php静态方法的问题,php 静态方法问题
- 微信农场,第二个QQ秀?
- 数据库中间件sharding-jdbc实现数据脱敏
- windows下将python自带的pip卸载了,怎么重新装pip
- nexus6 android 6.0 root,全网首发:一键ROOT大师ROOT Nexus 6
- 小米笔记本怎么进bios设置u盘启动?
- 搭建zabbix监控及邮件报警
- 基于ThinkPHP6搭建的后台管理系统
- bcc语料库下载_BCC语料库使用指南
- Win xp IIS无法启动解决办法收集