java面试之局部变量和成员变量的运算

java基础常见面试题笔记(上)——JavaGuide 从字节码中,我们发现装箱其实就是调用了包装类的valueOf()方法,拆箱其实就是调用了 xxxValue()方法。因此,等价于等价于注意:如果频繁拆装箱的话,也会严重影响系统的性能。我们应该尽量避免不必要的拆装箱操作。 阅读详情

简介

java常见的面试,有一个比较高频就是考察成员变量和局部变量的区别,掌握好这类题的回答,需要对JVM内存划分需要有一定的了解,需要知道什么数据放在JVM内存的哪一个区域里面。

面试题

public class ParameterTest2 {
    static int s;
    int i;
    int j;
    {
        int i =1;
        // 这里就近原则,i计算的上面i=1的值,而不是this.i的值
        i++;
        // 计算this.j
        j++;
        // 计算this.s
        s++;
    }
    public void test(int j) {
      // 这里就近原则,j计算的上面形参j的值,而不是this.j的值
        j++;
   	  // 计算this.i
        i++;
      // 计算this.s
        s++;
    }
    public static void main(String[] args) {
        ParameterTest2 parameterTest2 = new ParameterTest2();
        ParameterTest2 parameterTest3 = new ParameterTest2();
        parameterTest2.test(10);
        parameterTest2.test(20);
        parameterTest3.test(30);
        System.out.println(parameterTest2.i+","+parameterTest2.j+","+ParameterTest2.s);
        System.out.println(parameterTest3.i+","+parameterTest3.j+","+ParameterTest2.s);
    }
}

如果想轻松答出上面的面试题,你需要具备一下基本知识:变量的分类、JVM内存模型、变量的就近原则、非静态代码块的执行。

变量的分类

一个类中变量分为局部变量和成员变量,下面介绍两者的区别。

  • 声明的位置
    局部变量通常指的是方法的形式参数,在一个方法体中定义的一个变量以及在非静态的代码块中。
    成员变量是指的类中方法外的定义的,如果有static修饰指的就是类变量,如果没有就是实例变量。
  • 值存储位置
    首先看一下JVM的内存区域划分如下图所示:
    在这里插入图片描述
    堆(Heap) 主要存放所有对象的实例,以及数组。
    虚拟机栈(VM Stack)存放局部变量表,对象引用。
    方法区(Method Area) 存放被虚拟机栈加载的类信息、常量、以及静态变量。
  • 声明周期
  • 局部变量:每一个线程,每一次调用执行都是新的生命周期。
  • 实例变量:随着对象的创建而创建,随着对象的销毁而消亡,每一个对象的实例变量是相互独立的。
  • 类变量:随着类的初始化而初始化,随着类的卸载而消亡,该类的对象类变量都是共享的。

就近原则

上面的面试题有两处应用到了就近原则的问题,分别如下所示:

  • 非静态代码块出就近原则
    在这里插入图片描述
  • 方法中就近原则
    在这里插入图片描述

非静态方法代码块

非静态的方法代码块,会随着每一次对象的创建而执行一次。

面试题分析

有了上面的基础知识支撑,下面将一步步分析面试题main方法代码执行的过程。

ParameterTest2 parameterTest2 = new ParameterTest2();

首先创建了ParameterTest2这个对象,此时初始化静态变量s=0,成员变量i=0,j=0,然后执行非静态方法代码块:

 {
    int i =1;
    i++;
    j++;
    s++;
 }

这儿i++计算的是局部变量i的值(就近原则),j++计算的是成员变量j,s++计算的是静态成员变量s。
所以 代码执行后i=0,j=1,s=1 ,同理当再次创建ParameterTest2的时候,代码执行后i=0,j=1,s=2(s存储在方法区,被其他对象共享)。

 parameterTest2.test(10);

这个调用了实例方法:

    public void test(int j) {
        j++;
        i++;
        s++;
    }

parameterTest2对象执行test方法之前:i=0,j=1,s=2。
这里计算j++计算的是局部变量j(就近原则),i++计算的是成员变量i,s++计算的是静态成员变量s的值。
所以执行方法完后j=1,i=1,s=3,再次调用 parameterTest2.test(10)的执行完方法后时候j=1,i=2,s=4。
然后最重要的最后一步:

  parameterTest3.test(30);

parameterTest3对象执行test方法之前:i=0,j=1,s=4。
然后这里执行方法完后i=1,j=1,s=5。注意s静态变量被parameterTest2与parameterTest3对象所共享的。
所以上面面试题的输出结果为:
在这里插入图片描述

FPGA 核脉冲梯形成型 Verilog 实现:从 MATLAB 到 50MHz 采样率部署 本文详细解析了FPGA实现核脉冲梯形成型的完整流程,从MATLAB仿真到50MHz采样率的Verilog硬件部署。重点探讨了梯形成型算法对负指数信号的优化处理,包括定点数量化、流水线架构设计及资源优化技巧,为核辐射探测与高能物理实验提供高效解决方案。 阅读详情

相关推荐

Trae IDE与Playwright MCP:5分钟实现零代码网页数据抓取

网页数据抓取是数据采集和自动化处理中的基础技术,其核心原理是通过程序模拟浏览器行为,定位并提取页面中的结构化信息。传统方式依赖编写脚本处理网络请求、解析HTML和应对反爬机制,技术门槛较高。而结合AI与自动化工具的新范式,通过自然语言交互即可完成复杂操作,极大降低了技术门槛并提升了开发效率。这种技术价值在于将开发者从繁琐的编码中解放,使其更专注于数据分析和业务逻辑。在数据监控、市场调研、竞品分析等应用场景中,快速获取网页数据是关键需求。本文以Trae IDE集成Playwright MCP为例,演示如何通过

culi3118的博客 499

JAVA的成员变量和局部变量(详解)

详细总结了JAVA成员变量与局部变量的所有相关知识

qq_983030560的博客 4823

【Android】条形码/二维码扫描——ZXing源码分析

正在更新中 针对3.2.1版本源码 与其他版本代码可能会有出入,但核心思想基本不变。 首先从com.google.zxing.client.android包中的目录结构分析:Book:这个文件夹中有5个类: BrowseBookListener 实现了adapter的点击事项响应,通过获取ISBN,然后跳转到Google books中查询响应的详细信息。 SearchBookContents

年轻的学徒 2454

在JAVA中成员变量与局部变量有何区别?

在JAVA中成员变量与局部变量有七大区别

tester Xclincer的博客 528

避坑指南:STM32定时器测PWM频率占空比时,那些CubeMX没告诉你的细节(蓝桥杯真题衍生)

本文深入解析STM32定时器测量PWM频率和占空比时的关键细节,揭示CubeMX配置中未明确的时钟树原理和输入捕获机制。针对蓝桥杯嵌入式赛题中的常见问题,提供动态调整预分频器、多采样数字滤波等实战解决方案,帮助开发者避免测量误差,提升PWM测量精度和稳定性。

weixin_28692153的博客 340

保姆级教程:用R语言自动化处理FAERS季度数据(从文件合并到删除废弃Case)

本文提供了一份详细的R语言教程,指导如何自动化处理FAERS季度数据,包括文件合并和删除废弃Case。通过使用tidyverse、fs等R包,构建健壮的自动化流程,特别适合药物安全监测领域的数据分析师。教程涵盖环境准备、智能合并多季度数据、精准删除废弃Case等关键步骤,并提供了错误处理与日志记录的实用技巧。

weixin_42701915的博客 127

Java成员变量(全局变量)和局部变量

Java成员变量(全局变量)和局部变量

lv121218的博客 7619

在银河麒麟V10上部署Atlas 300i Duo:从固件到驱动的一站式踩坑笔记

日期:2025-09-09关键词:鲲鹏920、Atlas 300i Duo、银河麒麟V10、NPU、驱动、固件。

weixin_41544125的博客 2822

【Java 学习】详讲局部变量、成员变量

局部变量是指在方法、构造函数或代码块内声明的变量,它们只在声明它们的方法、构造函数或代码块中有效。局部变量的生命周期从声明时开始,到方法执行完毕或代码块执行结束时结束。声明位置:在方法、构造函数或代码块内部。作用范围:仅限于当前方法或代码块内部,方法外部无法访问。成员变量(也称为实例变量或类变量)是定义在类内部,但不在方法、构造函数或代码块中的变量。根据其修饰符的不同,成员变量又可以分为实例变量和静态变量。实例变量:定义在类中,但在方法外部。每个对象实例都有自己的实例变量。静态变量:使用static。

小蜗牛的珍贵百宝箱 2364

第58篇:AI技术实战:基于深度学习的智能音频内容审核系统

深度学习技术为智能音频内容审核系统提供了强大的支持,通过CNN、RNN和Transformer等模型,能够实现高效的音频内容检测和过滤。使用TensorFlow和Keras可以快速构建和训练音频审核模型,而预训练模型则可以进一步提升性能。数据预处理、特征提取和性能优化是提升智能音频审核系统性能的关键。希望本文的代码示例和注意事项能帮助你更好地理解和应用这些技术。接下来,我们将继续探索更多AI技术实战案例。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 711

Windows11 - Ubuntu 双系统及 ROS、ROS2 安装

在本教程中,我们将使用 Ubuntu 20.04 版本,该版本使用了新的 Ubuntu 桌面安装程序,该程序将包含在今后发布的所有 Ubuntu 版本中。如果你选择了这个选项,你会看到一个简单的界面,允许你选择要安装Ubuntu的硬盘,并通过滑块来决定你希望Ubuntu使用的磁盘空间大小。如果你的电脑有多个硬盘驱动器,那么只要它们各自有自己的驱动器,这个选项就能让你在安装 Ubuntu 的同时安装现有的操作系统。在此屏幕上,系统会提示您输入您的姓名和您的计算机名称,以显示在网络上。

机器人控制与仿真应用 4509

[JAVA基础] 成员变量和局部变量(一看就懂的总结归纳篇)

引言 成员变量和局部变量在每种编程语言中都有涉及,如果之前了解过其他语言的成员变量或者局部变量,那么在学习java中的成员变量和局部变量时可以看看有那些联系和不同,这一块的东西也不能说难,如果第一次接触可能会感觉有点乱,所以接下来我先把java中总结的成员变量和局部变量的部分内容先列出来,带着这些内容学起来会轻松很多! java变量分类 JVM中的主要内存空间 三大变量内存分配情况 三区介绍 栈区 存放各种方法(静态方法、实例方法、构造方法等) ps:局部变量就在这些方法体中; 堆区 存放new出来的

YXXXYX的博客 1万+

深入剖析 Wenet 下 AISHELL-1 的 run.sh 脚本:从数据准备到模型训练

run.sh脚本用于处理 AISHELL-1 数据集的整个训练和测试流程。我们将逐步分析脚本中的每个部分,包括环境变量、参数设置、各个阶段的执行等。stage: 设置脚本的起始阶段(如数据准备)。stop_stage: 设置脚本的结束阶段。通过对 Wenet 下 AISHELL-1 的run.sh脚本的详细剖析,我们希望你能更好地理解每个步骤的功能及其背后的原理。此脚本不仅为模型训练提供了便利,也为用户自定义和扩展训练流程提供了基础。希望本教程能帮助你顺利完成语音识别项目!

帅小柏的博客 1634

【Java面试题】第二期:Java基础篇,每周10道,根本停不下来~

数据在计算机底层是如何存储的?存储的基本单位是什么? 变量的定义要注意哪些问题? 成员变量和局部变量的区别? 值传递和引用传递是指什么? 自动类型转换与强制类型转换是指什么? 构造方法与普通方法的区别是什么? 自增\自减运算符(“++”\“--”)前置和后置使用的区别? static方法如何调用?有什么需要注意的点? static关键字的作用? final关键字的作用?

Technology changes the world of life 1427

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

学习java 第四天 各种运算符以及成员局部变量

学习java第四天所获

Miserables_的博客 1325

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java中的this关键字:this

如果不加上this,人家局部变量反手一个自己传自己,传完消失注销释放在内存的栈上的内存。百花丛中过,片叶不沾身,你的成员变量SET方法什么值也没捞到。就酱紫~~~~所以this很重要!~~1、运算符与、或、异或&:按位与|: 按位或。

2401_84008929的博客 422

一分钟搞定Java高频面试题

一分钟搞定Java高频面试题 一、变量赋值和计算 题目: public static void main(String[] args) { int i = 1; i = i++; int j = i++; int k = i + ++i * i++; System.out.println("i=" ...

张文军 827

Java面试二

我们知道计算机是二进制的,而且计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。存储方式:从变量在内存中的存储方式来看,如果成员变量是使用 static 修饰的,那么这个成员变量是属于类的,如果没有使用 static 修饰,这个成员变量是属于实例的。而对象存在于堆内存,局部变量则存在于栈内存。生存时间:从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动生成,随着方法的调用结束而消亡。

qq_53537633的博客 1002

java基础(一)

在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的⽂件),它不⾯向任何特定 的处理器,只⾯向虚拟机。Java 语⾔通过字节码的⽅式,在⼀定程度上解决了传统解释型语⾔执⾏ 效率低的问题,同时⼜保留了解释型语⾔可移植的特点。所以, Java 程序运⾏时相对来说还是⾼效 的(不过,和 C++,Rust,Go 等语⾔还是有⼀定差距的),⽽且,由于字节码并不针对⼀种特定的 机器,因此,Java 程序⽆须重新编译便可在多种不同操作系统的计算机上运⾏。

qq_42715246的博客 497

【面试】一、我瑟瑟发抖的第一个面试小笔记

文章目录自增自减运算符 自增自减运算符 int i=1; i = i++; System.out.println(i);//1 int j=i++; System.out.println(j);//1 参考博文 https://blog.youkuaiyun.com/qq_37937537/article/details/79931157 涉及到操作数栈与局部变量值的区别 ...

Java 452

1. 2019尚硅谷经典Java面试题(第1季)01,自增变量,冒泡排序,死锁,二分查找,多种单例模式,类和实例初始化,方法传参,递归与迭代,成员局部变量,

自增变量,冒泡排序,死锁,二分查找,多种单例模式,类和实例初始化,方法传参,递归与迭代,成员局部变量,

qq120631157的博客 314

尚硅谷经典Java面试题(第1季)

1.运行结果(5)(1)(10)(6)(9)(3)(2)(9)(8)(7)(9)(3)(2)(9)(8)(7)arr=[2,2,3,5]◆非静态实例变量显示赋值代码和非静态代码块代码从上到下顺序执行,而对应构造器的代码最后执行。◆()方法由非静态实例变量显示赋值代码和非静态代码块、对应构造器代码组成。◆方法的首行是super()或super(实参列表),即对应父类的方法。◆子类如果重写了父类的方法,通过子类对象调用的一定是子类重写过的代码。④实例化执行的是()(实例变量初始化、非静态代码块)...

m0_67401417的博客 583

Java的面向对象

public 返回数据类型 方法名(参数列表){ //其中参数列表: 数据类型 变量名 , 数据类型 变量名 的格式。public void 方法名(参数列表){ //其中参数列表: 数据类型 变量名 , 数据类型 变量名 的格式。成员变量又称为全局变量:声明在方法之外的,在该类中的任何地方都可以访问。System.out.println("我是工具类的a1方法");例如淘宝上的所有商品,例如微信的所有登录用户。提供方法a2(), 该方法只需要完成计算方法传递来的2个int值之和并返回。

2301_77434276的博客 81

JavaSE面试题(一)

一、自增变量 public class Main { public static void main(String[] args) { //i++是先把i压入栈,后对局部变量进行自增,++i是先对局部变量进行自增,后压入栈 int i = 1;//局部变量为1 i = i++;//先把1压入栈,局部变量i的值目前为1,自增以后,局部变量i的值变为2,赋值以后又变为1,所以这一步结果为1 int j = i++;//这一步和上一步雷同

ls_wifi的博客 779

java周记(第二周)

JAVA周记(第二周)

zjzty_的博客 189

Java基础知识面试题

文章目录JAVA基础一、Java特性二、标识符规则三、局部变量和成员变量的区别?四、静态变量和实例变量的区别?五、Java的数据类型?六、自动类型转换七、强制类型转换八、基本类型转换常见的错误和问题九、运算符十、键盘输入十一、switch语句中case标签十二、break和continue区别十三、重载和重写十四、Java参数传值机制十五、封装的定义十六、四种访问权限修饰符十七、this关键字十八、static 关键字十九、this和super的区别二十、完整的执行流程二十一、final关键字二十二、接口和

m0_49690267的博客 356

Java经典面试(一)

Java经典面试(一)一、JavaSE 一些面试知识点1、自增变量2、单例模式 一、JavaSE 一些面试知识点 1、自增变量 public static void main(String[] args) { int i = 1; i = i++; int j = i++; int k = i + ++i * i++; System.out.println("i=" + i); System.out.printl

weixin_42469070的博客 154
上一篇: java面试题之传值和传址
下一篇: java面试之数组常见操作
Galen-gao
博客等级 码龄9年 931粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值