Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深入了解Java方法作用域和生命周期,让你写出更高效的代码,有两下子!

深入了解Java方法作用域和生命周期,让你写出更高效的代码,有两下子!

原创
作者头像
bug菌
发布于 2024-06-26 16:10:33
发布于 2024-06-26 16:10:33
2220
举报
文章被收录于专栏:滚雪球学Java滚雪球学Java

  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~


🏆本文收录于 **[「滚雪球学Java」 ](https://blog.csdn.net/weixin_43970743/category_9600553.html)专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅**!持续更新中,up!up!up!!

代码语言:java
AI代码解释
复制
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

前言

  在Java开发中,方法是程序的基本构建块之一。在编写Java代码时,必须了解Java方法的作用域和生命周期。这将有助于您更好地编写高效的Java代码。

摘要

  本文将深入了解Java方法的作用域和生命周期,包括方法的访问修饰符、方法内部变量的作用域、方法的生命周期等。同时,本文还将通过源代码、方法介绍、测试用例等方式,让您更好地理解Java方法的相关知识。

正文

方法的访问修饰符

  Java方法的访问修饰符有public、protected、private和默认四种。

  • public方法可以被任何类和任何包中的其他代码访问。
  • protected方法可以被同一包中的代码访问,也可以被不同包中的子类访问。
  • private方法只能被同一类中的其他方法调用,不能被其他类访问。
  • 默认方法(没有修饰符)只能被同一包中的代码访问。

方法内部变量的作用域

  在Java方法内部定义的变量,只能在该方法中使用。这些变量被称为局部变量。局部变量的生命周期从方法开始执行时开始,到方法执行结束时结束。

方法的生命周期

Java方法的生命周期可以分为四个阶段。

  1. 编译时 方法的编译时阶段,主要是对方法进行语法分析和编译,生成字节码文件。
  2. 类加载时   当类被加载时,方法也会被加载到内存中。此时,会为方法分配一块栈空间。在方法被调用时,栈空间会被使用,存储方法中定义的局部变量和方法的执行状态。
  3. 执行时   当方法被调用时,会创建一个新的栈帧(Stack Frame),用于存储方法的局部变量和执行状态。方法执行完毕后,栈帧会被弹出,释放栈空间。
  4. 卸载时   当类被卸载时,与之关联的方法也会被卸载。此时,方法中使用的内存空间会被释放。

源代码

代码语言:java
AI代码解释
复制
public class MethodScopeDemo {
    private int privateNumber = 10;
    protected int protectedNumber = 20;
    public int publicNumber = 30;

    public void publicMethod() {
        int localVariable = 100;
        // 在此处可以访问 privateNumber、protectedNumber 和 publicNumber
        // 无法访问其他类中定义的 private 变量
    }

    protected void protectedMethod() {
        int localVariable = 200;
        // 在此处可以访问 protectedNumber 和 publicNumber
        // 无法访问其他类中定义的 private 变量
    }

    private void privateMethod() {
        int localVariable = 300;
        // 在此处可以访问 privateNumber 和 publicNumber
        // 无法访问其他类中定义的 protected 和 private 变量
    }

    void defaultMethod() {
        int localVariable = 400;
        // 在此处可以访问 publicNumber
        // 无法访问其他类中定义的 protected、private 和默认变量
    }
}

  接着我将对上述代码进行详细的一个逐句解读,希望能够帮助到同学们,能以更快的速度对其知识点掌握学习,这也是我写此文的初衷,授人以鱼不如授人以渔,只有将其原理摸透,日后应对场景使用,才能得心应手,所以如果有基础的同学,可以略过如下代码分析步骤,然而没基础的同学,还是需要加强对代码的理解,方便你深入理解并掌握其常规使用。

  这段Java代码定义了一个名为MethodScopeDemo的类,用于演示Java中方法和变量的作用域(访问控制)。下面是对这段代码的详细解析:

  1. 类定义 (public class MethodScopeDemo):定义了一个名为MethodScopeDemo的公共类。
  2. 类变量定义
    • private int privateNumber = 10;:定义了一个私有变量privateNumber,其作用域仅限于MethodScopeDemo类内部。
    • protected int protectedNumber = 20;:定义了一个受保护的变量protectedNumber,其作用域可以是同一个包中的其他类或MethodScopeDemo的子类。
    • public int publicNumber = 30;:定义了一个公共变量publicNumber,其作用域是最大的,可以被任何其他类访问。
  3. 方法定义
    • public void publicMethod():定义了一个公共方法publicMethod,其作用域可以被任何其他类访问。
    • protected void protectedMethod():定义了一个受保护的方法protectedMethod,其作用域与受保护的变量相同。
    • private void privateMethod():定义了一个私有方法privateMethod,其作用域仅限于MethodScopeDemo类内部。
    • void defaultMethod():定义了一个默认方法defaultMethod(没有指定访问修饰符),其作用域与包私有(package-private)相同,即同一个包中的其他类可以访问。
  4. 方法内部变量
    • 在每个方法中,都有一个局部变量localVariable被定义,其作用域仅限于该方法内部。
  5. 访问控制注释
    • 注释说明了在每个方法内部可以访问哪些变量。例如,在publicMethod中可以访问所有三个类变量,因为这个方法的作用域大于或等于这些变量的作用域。
  6. 方法调用
    • 尽管代码中没有显示方法调用,但通常在类的其他部分或另一个对象上调用这些方法。

代码作用

  这段代码演示了Java中不同访问修饰符对变量和方法的作用域的影响。它说明了如何根据需要控制类成员的可见性。

代码执行流程

  • 这个示例代码本身不包含执行流程,因为它只定义了类和方法的结构。要执行这些方法,需要在类的某个地方或另一个类的实例上调用它们。

代码改进

  • 代码可以进一步增加注释来提高代码的可读性,特别是对于初学者来说,明确指出每个变量和方法的作用域是很重要的。

小结

  这段代码是一个很好的Java访问控制示例,展示了如何使用不同的访问修饰符来控制类成员的可见性。这是学习Java编程中封装和访问控制概念的基础。

代码方法介绍

  • publicMethod:公共方法,可以被其他类和其他包中的代码访问。
  • protectedMethod:保护方法,可以被同一包中的代码访问,也可以被不同包中的子类访问。
  • privateMethod:私有方法,只能被同一类中的其他方法调用,不能被其他类访问。
  • defaultMethod:默认方法(没有修饰符),只能被同一包中的代码访问。

测试用例

代码语言:java
AI代码解释
复制
public class MethodScopeDemoTest {
    @Test
    public void testPublicMethod() {
        MethodScopeDemo demo = new MethodScopeDemo();
        demo.publicMethod();
    }

    @Test
    public void testProtectedMethod() {
        MethodScopeDemo demo = new MethodScopeDemo();
        demo.protectedMethod();
    }

    @Test
    public void testPrivateMethod() {
        MethodScopeDemo demo = new MethodScopeDemo();
        demo.privateMethod();
    }

    @Test
    public void testDefaultMethod() {
        MethodScopeDemo demo = new MethodScopeDemo();
        demo.defaultMethod();
    }
}

  接着我将对上述代码进行详细的一个逐句解读,希望能够帮助到同学们,能以更快的速度对其知识点掌握学习,这也是我写此文的初衷,授人以鱼不如授人以渔,只有将其原理摸透,日后应对场景使用,才能得心应手,所以如果有基础的同学,可以略过如下代码分析步骤,然而没基础的同学,还是需要加强对代码的理解,方便你深入理解并掌握其常规使用。

  这段Java代码看起来是用于测试MethodScopeDemo类中方法的JUnit测试类。然而,代码中有几个问题需要指出:

  1. 测试类定义 (public class MethodScopeDemoTest):定义了一个公共类MethodScopeDemoTest,通常用于包含JUnit测试方法。
  2. JUnit注解 (@Test):每个测试方法上方的@Test注解告诉JUnit这个方法是测试的一部分,应该被执行。
  3. 测试方法
    • testPublicMethodtestProtectedMethodtestPrivateMethodtestDefaultMethod是测试方法,它们尝试调用MethodScopeDemo类的方法。
  4. 问题
    • privateMethoddefaultMethodMethodScopeDemo类中是私有(private)和默认(无修饰符,即包私有)的,这意味着它们不能被同一个包中的其他类之外的任何类访问,包括这个测试类。因此,尝试从MethodScopeDemoTest类中调用这些方法将导致编译错误。
  5. 测试方法执行
    • 每个测试方法都创建了MethodScopeDemo类的一个实例,然后尝试调用相应的方法。
    • 对于testPublicMethodtestProtectedMethod,如果它们调用的方法是公共(public)或受保护(protected)的,那么这些调用是合法的,并且可以在测试中执行。
  6. 预期的测试行为
    • 测试应该验证被调用的方法的行为是否符合预期。这通常涉及到断言(使用assertEqualsassertTrue等)来检查方法的返回值或类的状态。
  7. 改进建议
    • 如果privateMethoddefaultMethod需要被测试,考虑将它们改为public或使用JUnit的反射测试私有方法的功能。
    • 为测试方法添加断言来验证结果,确保测试不仅仅是执行代码,还验证代码的行为。
  8. 示例测试方法:@Test public void testPublicMethod() { MethodScopeDemo demo = new MethodScopeDemo(); // 假设publicMethod有返回值,我们可以使用断言来验证它 int result = demo.publicMethod(); assertEquals(预期值, result); }

小结

  这段代码尝试为MethodScopeDemo类编写JUnit测试,但需要解决访问控制的问题,以确保所有测试方法都能正确执行。此外,添加断言来验证测试结果对于创建有效的单元测试是至关重要的。

小结

  本文不仅是对Java方法作用域和生命周期的全面解读,更是一次编程思维的深度修炼。通过掌握方法的访问控制和生命周期管理,我们能更高效地编写出结构清晰、性能优良的Java代码。同时,本文也提醒我们,持续学习和实践是精进编程技艺的不二法门。无论是通过阅读专业专栏,还是参与开源项目,每一步的努力都将使我们的技术雪球越滚越大,最终达到指数级的提升。所以,让我们一起在Java的世界里,不断探索,不断前进,迎接每一个技术突破带来的挑战和机遇。

总结

  在Java编程的世界里,方法不仅是程序的基本构件,更是我们构建功能模块、实现功能逻辑的核心单元。通过本文的深入剖析,我们了解到Java方法的作用域和生命周期是确保程序正确性与效率的关键因素。

  首先,方法的访问修饰符决定了方法的可见性,这直接关系到我们在不同类或包中调用方法的能力。public方法的开放性使得它们可以被任何外部代码访问;protected方法则在保持一定封装性的同时,允许子类访问;private方法的封闭性最强,仅允许在定义它的类内部访问;而没有明确指定修饰符的默认方法,其可见性被限制在了同一个包内。

  接着,我们探究了方法内部变量的作用域。局部变量,顾名思义,其生命周期仅限于方法内部,它们随方法的调用而创建,随方法的结束而销毁,这有助于我们管理内存和避免变量名的冲突。

  进一步,我们讨论了方法的生命周期,它包括编译、类加载、执行和卸载四个阶段。每个阶段都对应着不同的内存管理和执行流程,理解这些可以帮助我们优化程序性能。

  通过MethodScopeDemo类的源代码示例,我们具体展示了访问修饰符如何影响变量和方法的可见性,以及局部变量的作用域如何被限定在方法内部。此外,测试用例的引入,不仅帮助我们验证方法的行为,也强调了编写测试代码的重要性。

  最后,本文的附录源码提供了实际的代码参考,而作者bug菌的介绍,让我们了解到一个经验丰富的技术社区贡献者是如何通过分享知识来帮助他人成长的。

☀️建议/推荐你

  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

  码字不易,如果这篇文章对你有所帮助,帮忙给bugj菌来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。   同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!

📣关于我

  我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金等平台签约作者,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计30w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。


--End

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Java 类】001-访问修饰符、命名规范
总之,Java访问修饰符可以用来控制程序中各个部分的访问范围,从而实现类的封装,增强程序的可读性、重用性、可维护性和安全性。
訾博ZiBo
2025/01/06
4390
【Java 类】001-访问修饰符、命名规范
Java 中的访问修饰符-Java快速入门教程
在本教程中,我们将介绍 Java 中的访问修饰符,这些修饰符用于设置类、变量、方法和构造函数的访问级别。
jack.yang
2025/04/05
1330
探究Java方法的神奇魔法和参数传递奥秘,有两下子!
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
bug菌
2024/06/24
2770
探究Java方法的神奇魔法和参数传递奥秘,有两下子!
【Java 基础篇】Java 修饰符:掌握代码的灵魂之钥
在Java编程中,修饰符是一种关键元素,用于控制类、方法、变量和构造函数的访问性、行为和特性。Java提供了多种修饰符,每个修饰符都具有不同的作用和使用场景。本篇博客将围绕Java修饰符展开讨论,并提供示例代码来说明其用法和重要性。
繁依Fanyi
2023/10/12
3770
Java进阶-反射
来学习一下Java的反射,通过Class实例获取class信息的方法称为反射(Reflection),内容如下
reload
2024/03/01
2700
Java进阶-反射
Java 中变量的作用域
变量的作用域是一个程序的重要组成部分。因为它决定了某个时候每个地方某个变量是否可访问。与 C/C++ 一样。静态语言的作用域在编译期就是确定的。而且独立于函数调用堆栈。
技术从心
2019/08/06
2.1K0
Java 中变量的作用域
【IT领域新生必看】解密Java编程:成员变量与局部变量的神秘区别
在Java编程中,变量是存储数据的基本单元。变量的作用域和生命周期决定了它们在程序中的使用方式。成员变量和局部变量是Java中两种常见的变量类型。对于初学者来说,理解它们的区别是掌握Java编程的重要一步。本篇文章将详细介绍成员变量与局部变量的定义、用法及其区别,帮助你全面理解这些概念。
E绵绵
2025/05/25
1410
Java—面向对象高级(第十天)
前面我们说过面向对象最核心的套路是:设计对象来处理数据,解决问题。 如果你把面向对象高级这一部分课程学好,你设计出来的对象将更加好用。
用户4396583
2024/10/10
1330
【JAVA-Day07】深入了解Java中的常量、变量以及作用域规则
在Java编程中,了解常量和变量以及它们的作用域是非常重要的。本文将深入探讨Java中常量、变量的定义、属性,以及它们的作用域范围,同时提供了丰富的示例代码来帮助您更好地理解Java编程语言。
默 语
2024/11/20
2280
【JAVA-Day07】深入了解Java中的常量、变量以及作用域规则
作用域
实际上,确切地说,private访问权限被限定在class的内部,而且与方法声明顺序无关。推荐把private方法放到后面,因为public方法定义了类对外提供的功能,阅读代码的时候,应该先关注public方法:
背雷管的小青年
2020/07/08
5890
【C++ 类和对象 基础篇】—— 抽象思维的巅峰舞者,演绎代码的深邃华尔兹
在 C++ 中,类 是面向对象编程的核心概念之一。它是一种用户定义的数据类型,用于描述一组具有相同特性(属性)和行为(方法)的对象。
换一颗红豆
2024/12/27
9830
【C++ 类和对象 基础篇】—— 抽象思维的巅峰舞者,演绎代码的深邃华尔兹
揭秘Java方法的返回值,从void到诸多数据类型,有两下子!
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
bug菌
2024/06/25
6990
揭秘Java方法的返回值,从void到诸多数据类型,有两下子!
[重要] 深入理解 JavaScript 中的作用域和上下文
在本教程中,我们将深入学习 JavaScript 中作用域(Scope)的一切。 所以,来吧。
胡哥有话说
2019/07/25
1.4K0
[重要] 深入理解 JavaScript 中的作用域和上下文
Java入门(15)-- 反射
通过Java反射机制,可以在程序中访问已经装载到JVM中的Java对象的描述,实现访问、检测和修改描述Java对象本身信息的功能。Java反射机制的功能十分强大,在java.lang.reflect包中提供了对该功能的支持。
爱学习的程序媛
2022/04/07
2610
Java入门(15)-- 反射
第52节:String,权限修饰符,方法,集合
这个答案为1或者2,因为如果"dashu"这个字面值如果在常量池中已经出现过,那么就只创建一个对象,如果没有出现过就会创建两个对象,new的出现一定会有一个对象被创建,所有确保有一个对象被创建.
达达前端
2019/07/03
3720
第52节:String,权限修饰符,方法,集合
JAVA变量的作用域
http://www.cnblogs.com/AlanLee/p/6627949.html
逆回十六夜
2019/07/31
1.5K0
【面试题精讲】Java成员变量与局部变量的区别?
成员变量和局部变量都是 Java 中常用的变量类型。成员变量存储在堆内存中,具有较长的生命周期和共享性;而局部变量存储在栈内存中,生命周期短暂且仅限于所属的方法、构造函数或代码块。通过合理使用这两种变量,我们可以更好地管理数据和控制程序流程。
程序员朱永胜
2023/10/05
7690
「JAVA」Java面向对象之final、abstract抽象、和变量生命周期
final是最终、不可修改的意思, 在Java中它可以修饰非抽象类,非抽象方法和变量。但是需要注意的是:构造方法不能使用final修饰,因为构造方法不能够被继承。下面,咱们就来一一看看吧!
老夫编程说
2020/05/13
6740
「JAVA」Java面向对象之final、abstract抽象、和变量生命周期
【JavaSE】作用域
1. 基本使用 [在这里插入图片描述] VarScope public class VarScope { public static void main(String[] args) { Cat1 cat1 = new Cat1(); cat1.hi(); cat1.cry(); cat1.eat(); } } class Cat1{ //全局变量:也就是属性,作用域为整个类体 Cat类:cry eat 等方法使用属性
兮动人
2021/12/31
3580
探究 Java 中的 Class 类:透视类的本质和实现原理,有两下子!
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
bug菌
2024/07/03
3970
探究 Java 中的 Class 类:透视类的本质和实现原理,有两下子!
推荐阅读
相关推荐
【Java 类】001-访问修饰符、命名规范
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档