java-基础-变量

简介: 在java中,数据是以常量和变量两种方法形式进行存储和表示的(实际上,所有程序的数据都是这两种形式)。四类八种第一类:逻辑型boolean 默认初始值是false 1Byte 第二类:文本型char 2Byte unicode编码,一个汉字两个字节 第三类:整数型(byte、short、int、long) byte 1 Byte -128-127 short 2Byte int 4Byte java默认是INT long 8Byte L 不受操作系统的影响保证了java的移植性。

在java中,数据是以常量和变量两种方法形式进行存储和表示的(实际上,所有程序的数据都是这两种形式)。

四类八种

第一类:逻辑型boolean 默认初始值是false 1Byte
第二类:文本型char 2Byte unicode编码,一个汉字两个字节
第三类:整数型(byte、short、int、long)
byte 1 Byte -128-127
short 2Byte
int 4Byte java默认是INT
long 8Byte L
不受操作系统的影响保证了java的移植性。
第四类:浮点型(float、double)
double 是默认的
float F
在数学中0到1有无数个浮点数;而计算机是离散的,所以表示的时候有误差,计算机用精度(小数点后几位来表示正确),比较浮点数时a==0.1是不合适的,应该a-0.1==0;如果a是0.1,则即使有误差 a-0.1==0因为a和0.1都被表示为一个有误差的计算机二进制。比较按照精度来算。

变量

type variableName [=value][, variableName[=value]...];

type可以是java的基本类型之一。
type可以是Java的引用类型(即类及接口类型)的名字,外部类或接口必须有访
问权限,使用非lang包下的类必须先导入。
变量名(variableName),java约定变量名以能描述该变量意义的单词表示(单词小写),以增加程序的可读性。驼峰法则。
“=”,表示赋值,不是数学意义上的“等于”,java环境下的“等于”通常用于逻辑表达式,用符号“==”(双等号)表示。赋值同样不等于就相等哟,比如:

Integer a =129,b =129;
System.out.println(a==b);
//结果:false

其中a、b为Integer型引用变量,赋的值都是129,但是两者并不相等。
声明格式
变量的访问权限修饰符,访问权限标识符比照类的访问权限
static,静态成员变量修饰符,与它相对应的是实例变量
final,最终变量修饰符,即常量
类变量与实例变量的相同点:
1)都可以用任意权限修饰符对访问权限加以限制;2)都可以被类自身的方法直接调用。
类变量与实例变量的区别是:
1)存储位置不同。静态变量存储于方法区 method area,而实例变量存储于堆区heap area。
2)生命周期不同。静态变量在加载类过程中优先加载,其生命周期取决于类的生命周期;实例变量在创建实例时才创建,它的生命周期取决于实例的生命周期。
3)引用对象不同。静态变量属于类,被类的所有实例共享,可以直接使用类名来引用也可以通过类的实例引用;而实例变量则属于某个对象,它必须在创建对象后才可以
通过这个对象来使用。
4)使用方法不同。一个类只能有一个同名静态变量,无论是通过类或者任何一个实例对静态变量重新赋值,结果都是一样;而一个类创建多少个实例就会有多少个同名实
例变量,各实例变量存储空间不同,对其中一个实例变量重新赋值不影响其它实例的同名变量

JVM

method area,又叫静态区,跟堆一样,被所有的线程共享,它包含所有的class和static变量;方法区中包含的都是在整个程序中永远唯一的元素。
Stack area 栈(stack)区(VM栈和本地栈),分为3部分:基本类型变量区、执行环境上下文、操作指令区。每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。每个线程包含一个栈区,栈中只保存基础数据类型的对象的引用和自定义对象的引用,对象都存放在堆区中。栈区另外存放方法参数和局部变量,用于计算;
堆(heap)区存放对象,即类的实例。每个对象都包含一个与之对应的类的信息。jvm只含一个堆,被所有线程共享。堆中不存放基本类型的对象引用,只存放对象本身。

Java变量的分类

package codetest;

public class Variable {

    public Variable(){}
    public Variable(int constructorVar){
        //No Initialization but only declare,and final only is permitted.
        System.out.println("constructorVar: "+ constructorVar);
    }
    static{
        int staticBlockVar ;//only final is permitted
        staticBlockVar=2;//Modify the value of the static variable

        classVar=1;
        System.out.println("staticBlockVar's value: "+staticBlockVar);//The variable is define in a static block, and Can't use out the block
    }
    {
        System.out.println("non-quasi-static");
    }

    int instanceVar=1;

    //The default value of 0 is automatically assigned to classVar
    int samenameVar;//instance variable
    static int classVar;

    void changVar(int newValOfMemberVar){//No Initialization but only declare,and final only is permitted.
        int samenameVar=1;//local variable,only final is permitted

        try{
            this.samenameVar=3;//The use of a instance variable of the same name with local variable.
            System.out.println("The samenameVar local variable: "+ samenameVar);
            System.out.println("The samenameVar instance variable: "+this.samenameVar);

            instanceVar=newValOfMemberVar;
            classVar=2;

            int[] a;//do not initialize
            int[] array=new int[2];//Initialized to the default values
            array[1]=2;//To the second element to the assignment

            System.out.println("array[0]:"+ array[0]+ " array[1]:"+ array[1]);
            //System.out.println(a[0]);//error

        }catch(Exception ex){
            ex.toString();
        }
        //System.out.println(staticBlockVar);
    }

    public static void main(String[] args) {
        //静态变量可以直接使用类名引用 
        System.out.println("classVar: "+Variable.classVar);
        //实例变量必须通过对象来使用
        //System.out.println(Variable.member);//error:instanceVar is not a field
        Variable varObject =new Variable();
        System.out.println("varObject's instanceVar: "+varObject.instanceVar);

        //同一类的不同实例,分别为实例变量分配存储空间
        Variable varOb =new Variable();
        varOb.changVar(2);
        System.out.println("varOb's instanceVar: "+varOb.instanceVar);
        System.out.println("varObject's instanceVar: "+varObject.instanceVar);

        //同一类的静态变量,只分配一个存储空间
        System.out.println("classVar: "+Variable.classVar);
        System.out.println("varOb classVar: "+varOb.classVar);
        System.out.println("varObject classVar:" + varObject.classVar);


    }
}

1.1 class variable(类变量):声明在class内,method之外,且使用static修饰的变量,如上例中的classVar
1.2 instance variable(实例变量):声明在class内,method之外,且未使用static修饰的变量。如上例中的instanceVar
类变量与实例变量的相同点:
1)两者都可以用任意权限修饰符对访问权限加以限制;2)两者都可以被类自身的方法直接调用。3)两者都可以不显式初始化直接使用。java虚拟机会自动以默认值对它
们进行初始化,因此它没有违反java所有的变量必须初始化以后才能使用的约定。
类变量与实例变量的区别是:
1)存储位置不同。静态变量存储于方法区,而实例变量存储于堆区。
2)生命周期不同。静态变量在加载类过程中优先加载,其生命周期取决于类的生命周期;实例变量在创建实例时才创建,它的生命周期取决于实例的生命周期。
3)引用对象不同。静态变量属于类,被类的所有实例共享,可以直接使用类名来引用也可以通过类的实例引用;而实例变量则属于某个对象,它必须在创建对象后才可以
通过这个对象来使用。
4)使用方法不同。一个类只能有一个同名静态变量,无论是通过类或者任何一个实例对静态变量重新赋值,结果都是一样;而一个类创建多少个实例就会有多少个同名实
例变量,各实例变量存储空间不同,对其中一个实例变量重新赋值不影响其它实例的同名变量。
1.3 formal parameter variable(形参变量),包括一般方法参数变量(method parameter,声明在method小括号内的变量,如上例中的newValOfMemberVar)和构造器参数
变量(constructor parameter,声明在constructor小括号内的变量,如上例中的constructorVar)。java要求形参变量,只能使用默认访问权限和final声明,并且声明
时不能同时初始化。
1.4 local variable(狭义的局部变量):声明在method内的变量,只能以final修饰。
当方法内的局部变量与成员变量(指类变量或实例变量)同名时,以”this”关键字加以区别。如上例中实例变量sameanmeVar与方法changVar()中定义的局部变量
sameanmeVar同名,实例变量在使用时加前缀“this.”与局部变量加以区别。
1.5 exception-handler parameter(异常标识变量):声明在catch小括号内的变量,如上例中ex。
异常标识变更即catch方法的形参必须声明为Exception对象及其子对象类型,它只用于紧跟着的执行语句块内。
1.6 array element(数组):数组的元素值没有识别名称,必须透过数组和索引值(index)来识别,索引值从0开始。如上例中array数组第2个元素的使用。
新建一个数组,如果没有直接赋值,jVM会自动为它所有的元素初始为默认值。注意:是新建一个数组,不是声明一个数组。如上例中数组a[]只声明没有初始,使用会提
示错误。
1.7-1.8 static block variable(静态块变量主)和非静态块(non-quasi-static):声明在静态块内(static{…})或非静态块内({})的变量。如上例中的变量
staticBlockvar。它只能由final修饰,并且仅用于在声明的静态块内。
在使用这两种变量时要注意它们所在块的不同。一是执行时间不同。非静态变量是执行构造方法之前;静态块在类文件加载后的初始化阶段执行 。二是执行次数不同。静
态块只在类加载初始过程中执行一次;每一次初始化对象,都会导致一次非静态块的执行。这部分详细信息请参阅欣’s博客-《Java中自由块的执行顺序》。
2、根据变量内存来分类,Java变量有两种:
2.1 heap variable:占用的内存在heap中,这类变量包括了class variable,instance variable,array component,这类变量会自动被JVM初始化默认值。
2.2 stack variable:通常广义的局部变量(pan-local variable),其占的内存在stack中,这类变量包括了狭义的局部变量,method parameter,exception-handler
parameter,constructor parameter。狭义的局部变量不会被JVM初始化成默认值,使用者必须自行初始化该变量,但是parameter类(包括method parameter,exception-
handler parameter,constructor parameter)会被JVM初始化成传入值(即实参)。
3、根据使用方式来为变量分类,主要有三种:
3.1 class variable,与根据声明分类对应。
3.2 instance variable,与根据声明分类对应。
3.3 广义的局部变量,除了上面两种以及数组元素以外,都可视为广义的局部变量,数组通常被视为对象,array component视为对象的instance variable.
1、在Java中,所有的变量必须先声明再使用。
2、在static 方法中引用任何实例变量都是非法的。
一般来说,静态方法常常为应用程序中的其它类提供一些实用工具所用,在Java的类库中大量的静态方法正是出于此目的而定义的。

目录
相关文章
|
19天前
|
存储 缓存 安全
除了变量,final还能修饰哪些Java元素
在Java中,final关键字不仅可以修饰变量,还可以用于修饰类、方法和参数。修饰类时,该类不能被继承;修饰方法时,方法不能被重写;修饰参数时,参数在方法体内不能被修改。
22 2
|
27天前
|
Java 程序员 容器
Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
在Java中,变量是一个可以随时改变的数据容器,类似于一个可以反复打开的小盒子。定义变量时需指定数据类型和名称。例如:`int age = 25;` 表示定义一个整数类型的变量 `age`,初始值为25。 常量则是不可改变的数据容器,类似于一个锁死的铁盒子,定义时使用 `final` 关键字。例如:`final int MAX_SPEED = 120;` 表示定义一个名为 `MAX_SPEED` 的常量,值为120,且不能修改。 变量和常量的主要区别在于变量的数据可以随时修改,而常量的数据一旦确定就不能改变。常量主要用于防止意外修改、提高代码可读性和便于维护。
|
2月前
|
Java 编译器
java“变量 x 可能未被初始化”解决
在Java中,如果编译器检测到变量可能在使用前未被初始化,会报“变量 x 可能未被初始化”的错误。解决方法包括:1. 在声明变量时直接初始化;2. 确保所有可能的执行路径都能对变量进行初始化。
243 2
|
3月前
|
存储 Java
java基础(7)变量以及变量的分类
Java变量是内存中存储数据的基本单元,包含数据类型、名称和字面值。变量的数据类型决定了分配的内存空间大小。变量声明格式为“数据类型 变量名;”,变量名应符合标识符命名规范。变量可以重新赋值,但数据类型需一致。变量可以一行声明多个,作用域决定了变量的可用范围。变量分为局部变量和成员变量,局部变量定义在方法体内,成员变量定义在方法体外、类体内。
46 2
|
1月前
|
Java 编译器
Java重复定义变量详解
这段对话讨论了Java中变量作用域和重复定义的问题。学生提问为何不能重复定义变量导致编译错误,老师通过多个示例解释了编译器如何区分不同作用域内的变量,包括局部变量、成员变量和静态变量,并说明了使用`this`关键字和类名来区分变量的方法。最终,学生理解了编译器在逻辑层面检查变量定义的问题。
Java重复定义变量详解
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
86 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
2月前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
2月前
|
分布式计算 资源调度 Hadoop
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
82 4
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
2月前
|
Java
java中父类方法return this.对象还是变量,子类去调用this.这个方法的问题
本文探讨了在Java中,当父类的方法返回`this`对象或变量时,子类调用该方法的行为,以及`this`关键字在不同类中调用方法时的指向问题。
16 0
java中父类方法return this.对象还是变量,子类去调用this.这个方法的问题