iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java基础知识之成员变量和局部变量浅显易懂总结
  • 357
分享到

Java基础知识之成员变量和局部变量浅显易懂总结

2024-04-02 19:04:59 357人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录引言java变量分类JVM中的主要内存空间三大变量内存分配情况三区介绍栈区堆区方法区基本介绍成员变量局部变量变量使用总结引言 成员变量和局部变量在每种编程语言中都有涉及,如果之前

引言

成员变量和局部变量在每种编程语言中都有涉及,如果之前了解过其他语言的成员变量或者局部变量,那么在学习java中的成员变量和局部变量时可以看看有那些联系和不同,这一块的东西也不能说难,如果第一次接触可能会感觉有点乱,所以接下来我先把java中总结的成员变量和局部变量的部分内容先列出来,带着这些内容学起来会轻松很多!

java变量分类

在这里插入图片描述

JVM中的主要内存空间

在这里插入图片描述

三大变量内存分配情况

在这里插入图片描述

三区介绍

栈区

存放各种方法(静态方法、实例方法、构造方法等)
ps:局部变量就在这些方法体中;

堆区

存放new出来的对象(实例);

方法区

存放各个类,且静态变量在此初始化;

基本介绍

成员变量是在 类 中定义的变量
局部变量是在 方法 中定义的变量

成员变量

成员变量分为静态变量(类变量) 和 实例变量
静态变量有static修饰,它从该类的准备阶段就存在了,直到系统销毁这个类,静态变量的作用域与这个类的生存范围相同;
实例变量没有static修饰,它从该类的实例被创建时就存在,直到系统销毁这个实例,实例变量的作用域与对应实例的生存范围相同;

静态变量访问方法:通过类名访问,不需要创建实例;

类.静态变量

实例变量访问方法:通过实例访问,需要先new一个实例

实例.实例变量

其实这里主要注意的还是静态变量,主要内容可以看看我的这篇文章:Java中的static———静态变量

这里主要说一下成员变量初始化时在内存中运行机制;
先看一个代码:


public class MemoryShow {
    public static void main(String[] args) {
        Person p1 = new Person();
        Person p2 = new Person();
        Person.name = "李四";
        System.out.println("姓名:" + Person.name);
        System.out.println("p1年龄:" + p1.age);
        System.out.println("p2年龄:" + p2.age);
    }
}
class Person {
    //静态变量
    static String name = "张三";
    //实例变量
    int age;
}

简单分析一下,当程序第一次执行Person类时,系统先加载这个类,并初始化这个类,在类的准备阶段,系统就为该类的类变量分配内存空间,并指定默认初始值(静态变量name也是在这个阶段完成了初始化);
然后接下来系统就在堆内存中为Person类分配了一块内存区,且为age默认赋值为0;然后生成了Person对象,并通过引用变量p1指向该对象;
当再次执行Person类时,已经不需要再为Person类初始化了,所以直接生成了Person对象,通过p2指向它;

局部变量

局部变量相对成员变量就没有那么复杂了
先分别介绍一下局部变量中的三种不同形式:
形参: 在定义方法签名时定义的变量,形参的作用域在整个方法内有效
方法局部变量: 在方法体中定义的变量,作用域从定义该变量的地方生效,到该方法结束时失效
代码块局部变量: 在代码块中定义的变量,作用域从定义该变量的地方生效,到该代码块结束时失效

和成员变量不同的一点是:局部变量除了形参外,都需要显式初始化,就是指定一个初始值,否则无法访问;

局部变量在内存中的运行机制:
因为局部变量需要显式初始化,所以系统不会对它进行初始化,即系统并没有给局部变量分配内存空间,只有它赋值后,系统才会分配内存将该值放入其中;
因为局部变量不属于任何对象或者类,所以它存放在栈内存中,且栈内存的变量不需要系统垃圾回收,因为它们会随着方法或者代码块运行结束而结束;所以局部变量只保存基本类型或者对象的引用(引用变量),所以局部变量占用内存比较小;

java语法允许局部变量和成员变量重名,但是如果在一个方法里,局部变量会覆盖成员变量;
如果想要在该方法里访问成员变量,就需要通过**this引用(针对实例变量)或者类名(针对静态变量)**作为调用者来限定访问成员;
看一个代码就明白了:


public class RepeatTest {
    // 静态变量(类变量)
    static String name = "张三";
    // 实例变量 
    int age = 18;
 
    public static void main(String[] args) {
        // 局部变量   和静态变量name = "张三"重名
        String name = "李四";

        // 因为静态变量name被这里的局部变量覆盖,所以输出为“李四”
        System.out.println("姓名:" + name);

        // 这时候如果想要调用静态变量可以使用类来调用
        //不能用this调用的原因是:main方法是静态方法
        System.out.println("姓名:" + RepeatTest.name);

        // 调用test方法
        new RepeatTest().test();
    }
    public void test() {
        // 局部变量   和实例变量age = 18重名
        int age = 666;
        // 因为实例变量name被这里的局部变量覆盖,所以输出为“666”
        System.out.println("年龄:" + age);
        // 这时候如果想要调用实例变量可以使用this调用
        System.out.println("年龄:" + this.age);
    }
}

但是,从现在开始就要养成良好的编程习惯,在写代码时不要出现局部变量和成员变量重名的情况;

变量使用

说了这么多,可能你已经晕了,但是这些变量归根结底我们了解它们就是为了用它们,那什么时候用局部变量,什么时候用成员变量呢?
我们先看三个代码:


public class ScopeTest01 {
    //静态变量(类成员变量)
    //再次强调一下这里为什么定义静态变量而不是实例变量
    //因为main方法是静态方法,不需要对象只通过类调用,而实例变量必须有对象才能调用
    static int i;
    public static void main(String[] args) {
        for (i = 0; i < 5; ++i) {
            System.out.println("Hello World!!!");
        }
    }
}

public class ScopeTest02 {
    public static void main(String[] args) {
        //局部变量
        int i;
        for (i = 0; i < 5; ++i) {
            System.out.println("Hello World!!!");
        }
    }
}

public class ScopeTest03 {
    public static void main(String[] args) {
        // 代码块局部变量
        for (int i = 0; i < 5; ++i) {
            System.out.println("Hello World!!!");
        }
    }
}

这三个代码的运行结果都是一样的,而它们分别用了成员变量和局部变量,结果都一样,那我们就需要看看那种方法是最好的了;

首先,ScopeTest01 使用的是成员变量,我们都知道成员变量存在于堆内存中,且只有类销毁时或者实例销毁时它才销毁,这就将作用域扩大到类存在范围或者实例存在范围,作用域的扩大有两个坏处:

  • 增加了变量的生存时间,会导致更大的内存开销
  • 扩大了变量的作用域,不利于提高程序的内聚性

同理可以对比ScopeTest02 和 ScopeTest03,最后可以总结出 ScopeTest03 最符合规范;

所以定义变量的时候要尽可能的保证作用范围最小,这样可以很好的提高程序的性能,包括局部变量;

考虑使用成员变量有四种情况:

  • 如果定义的变量需要描述对象的信息,且每个对象都有可能不同,那么用成员变量中的实例变量;
  • 如果定义的变量所描述的信息对这个类的所有对象都相同,那么类相关的信息就定义为成员变量中的静态变量;
  • 如果某个类中需要一个变量保存该类或者实例运行时的状态信息,该变量定义为成员变量;
  • 如果某个信息需要在类的多个方法之间共享,则该信息使用成员变量

总结

成员变量和局部变量大概主要内容就是这些了,看完可能还是有点乱,一定要多看几遍,自己总结一下,这些东西是学习java的基础内容,这都搞不清的话,那么之后一会一个静态变量,一会一个局部变量都把你搞晕了;并且想要用java写出来好代码,就必须了解这些内容,这将会在你未来的开发中起到重要作用;
希望我们一起进步!!!

ps:内容有问题欢迎私信或者评论区讨论;

到此这篇关于Java基础知识之成员变量和局部变量浅显易懂总结的文章就介绍到这了,更多相关Java 成员变量 局部变量内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java基础知识之成员变量和局部变量浅显易懂总结

本文链接: https://www.lsjlt.com/news/136302.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java基础知识之成员变量和局部变量浅显易懂总结
    目录引言java变量分类JVM中的主要内存空间三大变量内存分配情况三区介绍栈区堆区方法区基本介绍成员变量局部变量变量使用总结引言 成员变量和局部变量在每种编程语言中都有涉及,如果之前...
    99+
    2024-04-02
  • python基础之局部变量和全局变量
    四种基本的函数类型 局部变量 就是在函数内部定义的变量【作用域仅局限于函数内部】 不同的函数 可以定义相同的局部变量,但是各自用各自的 不会产生影响 局部变量的作用:为了临时...
    99+
    2024-04-02
  • Python基础之变量的相关知识总结
    变量全都是引用 跟其他编程语言不同,Python的变量不是盒子,不会存储数据,它们只是引用,就像标签一样,贴在对象上面。 比如: >>> a = [1, 2, ...
    99+
    2024-04-02
  • java成员变量和局部变量有什么区别
    Java中的成员变量和局部变量有以下区别:1. 作用域不同:成员变量在整个类中都可见,而局部变量只在声明它的代码块内可见。2. 生命...
    99+
    2023-08-23
    java
  • java局部变量表的基础知识点及实例
    说明 1、局部变量表也叫局部变量数组或本地变量表。定义为一个数组,主要用于存储方法参数和定义方法中的局部变量。这些数据类型包括各种基本数据类型、对象参考和returnAddress类...
    99+
    2024-04-02
  • Java中局部变量和成员变量的区别详解
    目录一. 关于变量1. 概念2. 命名规范3. 作用范围4. 变量分类二. 局部变量1. 概念2. 特点3. 案例三. 成员变量1 概念2. 实例变量3. 静态变量4. 权限修饰符5...
    99+
    2023-05-20
    Java成员变量 Java 局部变量 Java成员变量 局部变量区别
  • Java中局部变量和成员变量有什么区别
    今天小编给大家分享的是Java中局部变量和成员变量有什么区别,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。目录一. 关于变量 概念 命名规范 作用范围 变量分类二. 局部变量 概念 ...
    99+
    2023-07-06
  • Java基本知识点之变量和数据类型
    Java中的变量和基本数据类型: 写完第一个java程序之后,我们对Java也有了初步的了解,现在我们再来继续认识一下Java中的基本知识点——变量和数据类型。 那么我们该怎样来认识...
    99+
    2024-04-02
  • 浅谈Java成员变量与属性的区别(简单最易懂的解释)
    例一:一个Student pojo类:public class Student{private String name;private int age;public String getName(){ return this.name;}p...
    99+
    2023-05-31
    成员变量 属性 java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作