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

目录
  • 引言
  • 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 成员变量 局部变量内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 一篇文章带你入门java变量与类型

    目录 整型变量 基本语法格式 代码示例 长整型变量 基本语法格式 代码示例 双精度浮点型变量 基本语法格式 代码示例 单精度浮点型变量 基本语法格式 代码示例 字符类型变量 基本语法格式 代码示例 字节类型变量 基本语法格式 代码示例 短整型变量 基本语法格式 代码示例 布尔类型变量 基本语法格式 代码示例 简单/内置类型小结 字符串类型变量 基本语法格式 代码示例 转义字符 字符串拼接 变量作用域 变量的命名规则 常量 字面值常量 final 关键字修饰的常量 总结 整型变量 基本语法格式 i

  • java局部变量表的基础知识点及实例

    说明 1.局部变量表也叫局部变量数组或本地变量表.定义为一个数组,主要用于存储方法参数和定义方法中的局部变量.这些数据类型包括各种基本数据类型.对象参考和returnAddress类型. 2.因为局部变量表是建立在线程栈上的线程私有数据,所以没有数据安全问题. 实例 private static int count=0; public static void recursion(int a,int b,int c){ long l1=12; short sl=1; byte b1=1; Stri

  • Java未赋值变量的初始值解析(默认值)

    目录 Java未赋值变量的初始值(默认值) 初始值(默认值) 实例变量(非静态字段) 类变量(静态字段) 本地变量 参数 解决java未赋值变量的默认值问题 如下所示 Java未赋值变量的初始值(默认值) 初始值(默认值) 参考:官方文档 Java程序中,任何变量必须初始化后才能使用. 以下为不同数据类型的默认值. 数据类型 初始值 byte 0 short 0 int 0 long 0L char 'u0000' float 0.0f double 0 boolean false 所有引用类型

  • java中int、double、char等变量的取值范围详析

    目录 1.java工具 2.代码简单框架 3.int 4.long 5.double 6.float 7.char 8.byte 9.short 10.总结 1.java工具 1.JDK:Java开发者工具,建议安装1.8版的. 2.IEDA:集成开发环境 2.代码简单框架 public为访问修饰限定符 class为类 HelloWorld为类的名称 public static void main(String[] args)相当于C语言的的main函数 System.out.println()

  • Java中不用第三个变量来互换两个变量的值

    我们先看看使用第三变量的方法.(开胃菜) class Swap{ public static void main(String[] args){ int a = 3; int b = 5; int c; c = a; //把a的值先存到c a = b; //把b存给a b = c; //把存在c的值倒赋给b System.out.println("a="+a); //a==5 System.out.println("b="+b); //b==3 } } 下面是运行结

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

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

  • Java成员变量与局部变量(动力节点Java学院整理)

    成员变量 我们来研究一个事物: 属性:外在特征:例如人的身高,体重 行为:能够做什么:例如人有说话,打球等行为. 而在Java语言中,最基本的单位是类,类就是用来体现事物的. 用类class来描述事物也是如此: 属性:对应类中的成员变量    行为:对应类中的成员函数 定义类其实就是在定义类中的成员(成员变量和成员函数) 拓展:类是一个抽象的概念,而对象就是类的具体的存在,体现.例如:生活中的汽车,可以看做一个类,我们称之为汽车类,每一台车都有颜色和轮胎数(可以定义为属性,即成员变量),每一台车

  • java中成员变量与局部变量区别分析

    本文实例分析了java中成员变量与局部变量区别.分享给大家供大家参考.具体分析如下: 成员变量:在这个类里定义的私有变量,属于这个类. 创建以及使用成员变量 复制代码 代码如下: public class Person {     String name;     String Sex;     int age;     double Height;         public static void main(String arges[])     {         Person p=ne

  • Java基础知识精通注释与数据类型及常量与变量

    目录 一. 注释 1.简介 2.类型 1.单行注释 2.多行注释 3.文档注释 3.注意事项 二.数据类型 1.简介 2.整型 3.浮点类型 4.char类型 5.boolean类型 三.常量与变量 1.常量 2.变量 一. 注释 1.简介 注释就是一种解释程序的文本,提高代码的可读性,帮助我们查找错误,不会影响程序的运行,不用担心可执行代码变得多. 2.类型 1.单行注释 单行注释是最常用的,格式://注释的内容. 用法如下: package day1; public class Demo01

  • 深入了解Java中成员变量与局部变量的使用与区别

    目录 一.成员变量和局部变量的区别 二.封装 private关键字 private的使用 this关键字 一.成员变量和局部变量的区别 类中位置不同:成员变量(类中方法外)局部变量(方法内部或方法声明上) 内存中位置不同:成员变量(堆内存)局部变量(栈内存) 生命周期不同:成员变量(随着对象的存在而存在,随着对象的消失而消失)局部变量(随着方法的调用而存在,醉着方法的调用完毕而消失) 初始化值不同:成员变量(有默认初始化值)局部变量(没有默认初始化值,必须先定义,赋值才能使用) 二.封装 1..

  • Java基础知识总结之继承

    一.继承的基本概念 什么是继承呢? 我们可以想一下,既然是"继承",那么它必须是在两个或多个类之间所发生的关系吧,这样我们就可以说:这个类继承自什么类,假如只有一个类的话,它既无法继承别的类,而且也没有别的类来继承它,这就构不成什么继承关系了哈,理清楚了这一层关系之后我们再来谈谈它继承了什么呢? 既然说什么什么类继承自什么什么类,那它肯定要从继承的那个类中继承点什么呀!我们把发生继承关系的这两个类称为父类和子类,子类可以继承父类的属性和方法,这个就是继承的基本概念,下面我们来系统的学习

  • Java基础知识汇总

    Java基础知识 1.Java语言的优点: 1)Java是纯面向对象语言 2)与平台无关性,一次编译到处运行 3)Java提供了狠多内置类库 4)提供了对web应用的支持 5)具有较好的安全性(数组边界检测.Bytecode检测)和健壮性(强制型机制.垃圾回收器.异常处理) 6)去除c++难以理解的一些特性(头文件 指针 运算符重载 多重继承) 2.java与c++的异同: 1)Java为解释型语言,c++为编译型语言,java会慢但是跨平台 2)Jave为纯面向对象,c++既面向对象又能面向过

  • java基础知识 super和this使用解析

    这篇文章主要介绍了java基础知识 super和this使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 super关键字的用法有三种: 1.在子类的成员方法中,访问父类的成员变量 2.在子类的成员方法中,访问父类的成员方法 3.在子类的构造方法中,访问父类的构造方法 this和super区别 super关键字用来访问父类内容,this关键字用来访问本类内容. 1.在本类的成员方法中,访问本类的成员变量 2.在本类的成员方法中,访问本类的

  • Java基础知识之注解、元注解

    目录 注解 注解作用 Java预定义的注解 自定义注解 元注解 实例: 注解使用总结 总结 注解 Java注解也称Java标注,是jdk1.5(5.0)后的新特征.Java语言中的类.方法.变量.参数和包等都可以被标注.和Javadoc不同,Java注解可以通过反射获取标注内容,在编译器生成类文件时,标注可以被嵌入到字节码中,Java虚拟机可以保留标注内容,在运行时可以获取到标注内容,当然它也支持自定义Java标注 功能:用于说明程序 用途:一般用在框架中使用 格式:@AnnotationNam

  • Java中成员方法与成员变量访问权限详解

    记得在一次面试的笔试题中,有的面试官会要求写出具体的像pullic这些访问限定符的作用域.其实,平常我都没去系统的考虑这些访问限定符的作用域,特别是包内包外的情况,OK,笔试不行了. 这是java基本的知识,也是公司看重的,那没办法啦,我的脑袋记不住东西,那我只能把这些东西写下来方便自己温故知新,不废话了,贴代码了. 代码如下: package com.jaovo; /** *_1_ 成员变量访问权限的求证 * public private protected default(默认的权限) *自

随机推荐