变量的定义
变量的本质是:
一个"可操作的存储空间",可以理解为类似我们的计算机体系结构里面的寄存器的意思。Int a =3;表示变量的空间大小为4个字节。!!!变量是程序中最基本的存储单元!!!
Java是强类型语言,每个变量都必须声明其数据类型
类比车位:
-
内存空间有限---车位有限
-
车位上编号---内存地址(空间位置,对应特点1)
-
车位的大小和停放的车不确定---特点1
-
因为有以上的区别所以在定义一个变量的时候需要:声明
-
声明需要:1.指定变量名称 2.指定数据类型
特点:
-
空间位置确定,里面的值不确定---值可变,空间位置一定不变---便于寻址
-
可通过变量名访问对于的"存储空间",从而操纵这个"存储空间"的存储值---这里需要注意他说的是访问存储空间而不是访问值
一个完整的变量需要包含的内容:
-
变量名---在变量使用前必须对其声明。声明以后才能分配对应的存储空间。
-
变量类型
-
作用域
-
变量必须是一条完整的语句,以';'结束
程序中最基本的存储单元
变量声明格式---变量在代码里面怎么写
变量的声明:
public class TestVarNo_1{
public static void main(String[] args){
//main方法实际是定义程序的入口,让虚拟机知道从哪里开始执行代码。
//变量的声明(定义变量)以年龄为例子---程序员忌讳使用拼音或者字母去作为变量名。必须使用英文单词
//Java是一个强类型语言,只要声明变量就必须定义数据类型---根据前面说到的定义
//int age = 10; //数据类型在开头定义。定义为int整数类型。
//int age;是在声明变量的数据类型和变量名字。
//age = 10;是给变量赋值。如果分开写这两步的话那么在反编译的class文件里面会直接合并成一句。例如
/*
int age;
age = 18;
其效果 = 这样写:int age = 18;
*/
//如果只定义一个变量没有给变量赋值在class文件里面就不会出现该变量。相当于没有定义,使用的时候会出错!!!
/*
声明和赋值会自动合成一句话,即便分开写。
变量名在反编译的过程中会被随机改掉
*/
int age = 18;
age = 20;
age = age + 2;
age = age + 8;
/*
因为Java是逐行去执行class文件,所以变量在每一行进行定义的话他的值会一直更改
*/
System.out.println(age);
}
}
扩展:
public class TestVarNo_2{
public static void main(String[] args){
int a = 10;
int b = 20;
int c = a + b;
System.out.println(c);
}
}
//在命令行通过:javap -v 字节码文件名查看下面的内容
变量的赋值:
int age /*这里是声明变量数据类型和变量名*/ = 18;//18是对age变量进行复制
根据类和方法的不同变量一开始赋值也不同。可以赋值也可以不赋值
变量的使用:
System.out.println(age);//就是一个对变量的使用。
变量的内存:
-
变量名的目的是为了去寻址,在计算机的众多存储器当中寻找到确定的那个存储器---可以类比到接口的参数上。
-
数据类型决定了该存储器的大小。不同的数据类型一开始给你划分的数据存储大小不一样。
-
class文件中定义完变量以后会开辟一个存储空间给变量名存储他对应的值,开辟空间的大小基于你定义的数据类型。
变量的作用域:
作用域指的就是作用范围,变量在什么范围中有效。
作用范围是离变量最近的{}---局部变量
/*
局部变量(local variable):定义在方法中的变量---这里main就是一个方法!!!
[局部变量需要初始化变成实例变量以后才能调用方法使用]
成员变量(实例变量:menmber variable):方法外面,类的里面---class是类,main是方法。
静态变量(类变量:static variable)
*/
public class TestVarNo_4{
int b = 20;
public static void main(String[] args){
System.out.println(a);//这里这个a没有结果
int a = 10;
System.out.println(a);//这里这个a可以输出结果
System.out.println(b);//这里的这把b也是可以输出结果的,因为b定义在class下
}
public void eat(){
System.out.println(b);//这里的b也是可以输出的
System.out.println(a);//这里的a是不可以输出的,因为他只是在上面的main方法里面定义了,所以他的作用域只是在上面的main方法下。
int a = 30;//这个不是变量的重复定义,变量的重复定义只是说在一个方法里面不可以出现重复的变量名。!!!两个相同比变量名在不同的方法下他们的作用域不同!!!
System.out.println(a);;//这个a的输出结果是最近的{}的作用域下。
{
int c = 40;
System.out.println(c);//yes
int a =50;//no,因为在外层作用域已经定义了a,这里在定义a属于重复定义
}
System.out.println(c);//no,因为在外层没有定义变量c,所以无法输出。
}
}
Java代码中的作用域的几个重要的点:
-
class类下定义的变量可以在class下任意的方法内调用---{}有包含的关系,外层定义的变量可以在内层调用。---可以理解为覆盖全方法
-
在外层定义过的变量在内层在定义一次机会出错---重复定义变量。
-
内层定义的变量在外层不可以调用。
-
*这里的层均是指"{}"内的代码逻辑。*
备注:一会写的代码不要去运行,会出错
习题:
public class TestVarNo_3{
public static void main(String[] args){
int num1 = 10;
int num2 = 20;
num1 = num2;
num2 = num2 + 10;
num1 = num2 - 10;
num2 = num1;
System.out.println("num1="+num1);
System.out.println("num2="+num2);
//结果是两个都是20
}
}
一个变量的声明格式:
type varName [value][,varName[=value]...];//[]里面的内容为可选项,可有可无。
数据类型 变量名 [=初始值][,变量名 =[=初始值]...];
举例可以写成:
int age = 18, age2 = 80;
数据类型与字节的关系:
Java变量的分类
局部变量(local variable)
成员变量(实例变量:menber variable)
静态变量(类变量:static variable)
局部变量(local variable)
特点:
-
定义在方法或者语句块内部的变量
-
声明周期: 从声明位置开始到方法或语句块执行完毕位置
-
局部变量再使用前必须先声明、初始化(赋初值)在使用
/**
* LocalVariable
* @author Lucifer
* 在代码或者语句块当中使用
*/
public class TestVariableNo2{
public static void main(String arguments[]){
int age = 18; //This is a local variable,他定义在方法中,所以这个方法里面的变量,所以在这个方法里面可以任意使用这个变量
{
int salary = 10000;
System.out.println(age); //可以进行这样的调用
}
System.out.println(salary); //不可以进行这样的调用,因为再语句块里面的变量再语句块完毕的时候就已经结束了
}
}
成员变量(实例变量:member variable)
特点:
-
定义在方法外部、类的内部(没有被static修饰),从属于对象(对象的成员)
-
声明周期: 伴随对象始终
/**
* 成员变量(实例变量:member variable)
* @author Lucifer
*/
public class TestVariableNo3{
int freight; //这是一个成员变量,可以不用初始化值。如果没有初始化成员变量的值那么他会按照下表的规则进行初始化
public static void main(String arguments[]){
...; //方法
}
}
成员变量初始化值:
静态变量(类变量:static variable)
特点:
-
使用static定义,从属于类(系统启动的时候就会加载类,到系统关闭才会卸载。类变量的存在周期最长)
-
声明周期: 伴随类始终,从类加载到卸载
/**
* static variable
* @author Lucifer
*/
public class TestVariableNo4{
static int size; //这里的static不是数据类型,只是一个关键字。所以在声明变量的时候一样需要声明对象的数据类型
public static void main(String arguments[]){
...; //方法
}
}
重点:
本章要点只是介绍局部变量
如果要介绍成员变量(实例变量)、静态变量(类变量)必须要学习面向对象。