vlambda博客
学习文章列表

看似简单,却难理解的基础知识丨Java变量要怎么掌握呢?!

点击上方蓝字关注我们

一. 变量的含义

首先,我们要知道什么是变量。官方的定义是变量是内存中一块区域,用于存放数据。其实更容易理解的说法是变量就是一个名字,你刚买了一条小狗,想给他起个名字叫旺财,旺财就是变量。你新买了一只猫,想叫它阿花,阿花就是一个变量。所以这是第一层含义,变量就是个名字。

其次,我们要知道变量表达的具体含义。上面我们新买的狗叫旺财,当你下次叫旺财的时候,一定是叫的那条狗,你唤阿花的时候,一定是唤的那条猫。我们一旦给一个具体的事物起了一个名字,下次再使用时,一定代表的是具体事物。

第三,如果你买的那条狗,十几年过去了,他的寿命结束,你可以继续买一条狗,还叫它旺财,也就是说我们可以为同一个名字指定不同的值。同理就像我们的年龄一样,今年18岁明年19岁,它是可以改变的。

这些都是我们在现实中遇到的具体问题,但是java的开发者,他们也是人,也是生活在这个世界上,他的想法一定和我们平常人没有太大的区别,只是他们把这种现象设计成语法定义在了java中,以下面的例子说明。

//现实中
狗 旺财 = 刚买的那条狗;
//意思有一个名字叫旺财,它是一条狗,它就是我刚买的那条狗

//程序中
int age = 18;
//意思是有一个名字叫age,它是一个int,它就是18

上面两行语句其实所要表达的含义是一样的!

二. 基本类型

在上面代码中,我们看到一个单词是int,那么int是什么意思呢?其实它就像我们现实中的狗、猫、猪、羊一样,都代表一个物种,表示的是一种事物。int在java中表示的是整数,除了int还有其他的类型吗?答案是有的。在java中除了int表示整数,还有double表示小数,还有boolean表示对错,还是char表示字母和数字,这些类型在java中都被称作基本类型。

int age = 18;
double salary = 20000.0;
boolean isAdult = true;
char flag = 'A';

这时我们可能会想到一个问题,我们现实中旺财,阿花表示的一个具体存在的狗,一个具体存在的猫。而在上面定义age、salary这些变量名表示的具体的数值是保存在哪里的呢?这个就需要从计算机存储原理上进行理解。老谢先跟大家简单地说一下,就是计算机的CPU会为每一个运行的java程序,分配一个块内存的空间,用于保存程序在运行中产生的变量及其值。而java又把这块内存的区域分成堆、栈等几个部分,类似我们家里有主卧、次卧、书房一样。我们上述的变量及其值就保存在栈这块内存的区域中,如下图:

看似简单,却难理解的基础知识丨Java变量要怎么掌握呢?!

上图是基本类型的数据在内存中进行保存的形式,java规定所有基本类型的值都保存在栈内存中。

三. 引用类型

那java中除了基本类型的数据,还有其他类型的数据吗?答案是肯定的。除了基本类型的数据之外,还有其他类型的数据,比如引用类型。那么引用类型的数据值是保存在哪里的呢?我们用下面这个例子给大家做解释:

public class Dog {
    String name;
    ing age;
}

上面代码定义了一个狗类,表示狗这种类型的动物,我们可以根据这个类来创建一只具体的狗,在java是这样表示的:

Dog wangcai = new Dog();

这里wangcai就是一个变量,它表示我们创建的一个具体的狗(对象),它在内存中的表示形式是这样的:

我们会发现我们创建的引用类型的值,也就是new的对象是存放在堆内存中的。没错,在java中所有引用类型变量表示的值都是存放在堆中的。

四. 一道经典面试题

那么知道了变量的值存放在何处,这对于编写程序有什么用处呢?我们来看这样一道经典的面试题:

public class Demo {

    public static void main(String[] args) {
        int a = 8;
        changNum(a);
        
        Dog dog = new Dog();
        dog.age = 1;
        changDog(dog);
        
        System.out.print(a);
        System.out.print(dog.age);
    }
    
    public static void changNum(int a) {
        a = 10;
    }
    
    public static void changDog(Dog dog) {
        dog.age = 2;
    }

}

请问上面的代码中,最后打印输出的a的值,和dog.age的值分别为多少?

如果我们想要理解这个题目,就必须知道变量的值保存在哪里,是如何进行传递的。简单地说,基本类型的值是保存在栈中,传递的值,值传递之后就和它没有关系了,不会影响原来的值。而引用类型传递的是堆中的对象,原来的变量在方法执行结束后,还依然指向堆中的对象,所以会影响原来的变量。所以上面问题的答案,分别打印出来的值82。

在java的学习中,任何一个知识点,其实都挺重要,一些看似简单的内容,如果揉碎了展开了,也会让你收获很多。希望大家在以后学习的过程中,能够深入理解和琢磨,而不是浮于表面,否则在面试中只会被虐的怀疑人生。

今日份干货学习,喜欢的同学评论区回复“666”!

精选第一名,可以领取办公鼠标垫一个哦!

点击【阅读原文】,零基础免费学Java!