Java Review (八、面向对象----成员变量和局部变量),2024年最新顺丰 面试

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

// P2访问的eyeNum类变量依然引用Person类的,因此依然输出2

System.out.println(“p2对象的 eyeNum类变量值:” + p2.eyeNum);

}

}

结果:

Person 的 eyeNum 类变量值:0

p变量的 name变量值是:null;p对象的 eyeNum 变量值是:0

p变量的 name变量值是:孙悟空;P 对象的 eyeNum 变量值是:2

Person类的 eyeNum 类变量值:2

p2对象的 eyeNum类变量值:2

成员变量无须显式初始化:只要为一个类定义了类变量或实例变量,系统就会在这个类的准备阶段或创建该类的实例时进行默认初始化,成员变量默认初始化时的赋值规则与数组动态初始化时数组元素的赋值规则完全相同。

类变量的作用域比实例变量的作用域更大:实例变量随实例的 存在而存在,而类变量则随类的存在而存在。实例也可访问类变量,同一个类的所有实例访问类变量时, 实际上访问的是该类本身的同一个变量,也就是说,访问了同一片内存区。

局部变量


局部变量根据定义形式的不同,又可以被分为如下三种。

  • 形参:在定义方法签名时定义的变量,形参的作用域在整个方法内有效。

  • 方法局部变量:在方法体内定义的局部变量,它的作用域是从定义该变量的地方生效,到该方 法结束时失效。

  • 代码块局部变量:在代码块中定义的局部变量,这个局部变量的作用域从定义该变量的地方生 效,到该代码块结束时失效。

与成员变量不同的是,局部变量除了形参之外,都必须显式初始化。也就是说,必须先给方法局部变量和代码块局部变量指定初始值,否则不可以访问它们。

  • 代码块局部变量的作用域是所在代码块,只要离开了代码块局部变量所在的代码块,这个局部变量就立即被销毁, 变为不可见

  • 方法局部变量,其作用域从定义该变量开始,直到该方法结束

  • 形参的作用域是整个方法体内有效,而且形参也无须显式初始化,形参的初始化在调用该方法时由 系统完成,形参的值由方法的调用者负责指定

当通过类或对象调用某个方法时,系统会在该方法栈区内为所有的形参分配内存空间,并将实参的值赋给对应的形参,这就完成了形参的初始化。

作用范围与命名


在同一个类里,成员变量的作用范围是整个类内有效,

  • 一个类里不能定义两个同名的成员变量,即使一个是类变量,一个是实例变量也不行;

  • 一个方法里不能定义两个同名的方法局部变量,方法局部变量与形参也不能同名;

  • 同一个方法中不同代码块内的代码块局部变量可以同名;

  • 如果先定义代码块局部变量,后定义方法局部变量,前面定义的代码块局部变量与后面定义的方法局部变量也可以同名。

Java允许局部变量和成员变量同名,如果方法里的局部变量和成员变量同名,局部变量会覆盖成员 变量,如果需要在这个方法里引用被覆盖的成员变量,则可使用this (对于实例变量)或类名(对于类变量)作为调用者来限定访问成员变量。

成员变量的初始化和内存中的运行机制

===================================================================================

当系统加载类或创建该类的实例时,系统自动为成员变量分配内存空间,并在分配内存空间后,自动为成员变量指定初始值。

实例二、PersonDemo.java

//创建第一个Person对象

Person pl = new Person();

//创建第二个Person对象

Person p2 = new Person();

//分别对两个Person对象的name实例变量赋值

pl.name = “张三”;

p2.name = “孙悟空”;

//分别为两个Person对象的eyeNum类变量赋值

pl.eyeNum =2;

p2.eyeNum = 3;

  • 当程序执行第一行代码_Person p1 = new Person();_时,如果这行代码是第一次使用Person类,则系统通常会在第一次使用Person类时加载这个类,并初始化这个类。在类的准备阶段,系统将会为该类的类变量分配内存空间,并指定默认初始值。 当Person类初始化完成后,系统内 存中的存储示意图如图一所示。

图一:初始化 Person 类后的存储示意图

在这里插入图片描述

从图一中可以看出,当Person 类初始化完成后,系统将在堆内存中为Person类分配一块内存区(当 Person类初始化完成后,系统会为 Person类创建一个类对象),在这块内存区里包含了保存eyeNum类变量的内存,并设 置eyeNum的默认初始值:0。

  • 系统接着创建了一个Person 象,并把这个Person对象赋给p1变量,Person对象里包含了名为name 的实例变量,实例变量是在创建实例 时分配内存空间并指定初始值的。当 创建了第一个Person对象后,系统内存中的存储示意图如图二所示。

图二:创建第一个 Person 对象后的存储示意图

在这里插入图片描述从图二中可以看出,eyeNum类变量并不属于Person对象,它是属于Person类的,所以创建第 ―个Person对象时并不需要为eyeNum类变量分配内存,系统只是为name实例变量分配了内存空间, 并指定默认初始值:null。

  • 接着执行_Person p2 = new Person();_ 代码创建第二个Person对象,此时因为Person类已经存在于堆内存中了,所以不再需要对Person类进行初始化。创建第二个Person对象与创建第一个Person对象并 没有什么不同。

  • 当程序执行 p1.name =“张三”; 代码时,将为p1的name实例变量赋值,也就是让图二中堆内存中的name指向”张三"字符串。执行完成后,两个Person对象在内存中的存储示意图如图三所示。

图三:为第一个 Person 对象 name 实例变量赋值后的存储示意图

在这里插入图片描述

从图三中可以看出,name实例变量是属于单个Person实例的,因此修改第一个Person对象的 name实例变量时仅仅与该对象有关,与Person类和其他Person对象没有任何关系。同样,修改第二个 Person对象的name实例变量时,也与Person类和其他Person对象无关。

  • 直到执行_p1.eyeNum = 2;_代码时,此时通过Person对象来修改Person的类变量,从图三中看出,Person对象根本没有保存eyeNum这个变量,通过p1访问的eyeNum类变量,其实还是Person 类的eyeNum类变量。因此,此时修改的是Person类的eyeNum类变量。修改成功后,内存中的存储示 意图如图四所示。

图四:设置 p1 的eyeNum 变量之后的存储示意图

在这里插入图片描述

从图四中可以看出,当通过p1来访问类变量时,实际上访问的是Person类的eyeNum类变量。 事实上,所有的Person实例访问eyeNum类变量时都将访问到Person类的eyeNum类变量,也就是图四中灰色覆盖的区域,本质其实还是通过Person类来访问eyeNum类变量时,访问的是同一块内存。基于这个理由,当程序需要访问类变量时,尽量使用类作为主调,而不要使用对象作为主调,这样可以避免程序产生歧义,提高程序的可读性。

局部变量的初始化和内存中的运行机制

===================================================================================

局部变量定义后,必须经过显式初始化后才能使用,系统不会为局部变量执行初始化。这意味着定 义局部变量后,系统并未为这个变量分配内存空间,直到等到程序为这个变量赋初始值时,系统才会为局部变量分配内存,并将初始值保存到这块内存中。

与成员变量不同,局部变量不属于任何类或实例,因此它总是保存在其所在方法的栈内存中。

  • 如果局部变量是基本类型的变量,则直接把这个变量的值保存在该变量对应的内存中;

  • 如果局部变量是一个 引用类型的变量,则这个变量里存放的是地址,通过该地址引用到该变量实际引用的对象或数组。

栈内存中的变量无须系统垃圾回收,往往随方法或代码块的运行结束而结束。因此,局部变量的作用域是从初始化该变量开始,直到该方法或该代码块运行完成而结束。因为局部变量只保存基本类型的值或者对象的引用,因此局部变量所占的内存区通常比较小。

最后

即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!

我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:

Dubbo面试专题

JVM面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Java并发面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Kafka面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MongDB面试专题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

MyBatis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MySQL面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Netty面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

RabbitMQ面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Redis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Spring Cloud面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

SpringBoot面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

zookeeper面试专题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

常见面试算法题汇总专题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

计算机网络基础专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

设计模式专题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
5535)]

计算机网络基础专题

[外链图片转存中…(img-JMYTE2iR-1713056385536)]

设计模式专题

[外链图片转存中…(img-iW4i7BWb-1713056385536)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-jGKrw82P-1713056385536)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值