知识框架
🏀1.字面量(数据)
❤️关于程序当中的数据
⭐️软件在处理数据之前需要能够表示数据,在java代码中怎么去表示数据呢?在java中有这样的一个概念:字面量。
⭐️注意:在java语言中“数据”被称为“字面量”。
例如:10、1.23、true、false、'a'、"abc"以上这些都是数据,在程序中都被叫做“字面量”。
❤️字面量可以分为很多种类:
⭐️整数型字面量:1 2 3 100 -100 -20 ....
⭐️浮点型字面量:1.3 1.2 3.14.....
⭐️布尔型字面量:true、false,表示真和假;true表示真,false表示假
⭐️字符型字面量:'a'、'b'、'中'
⭐️字符串型字面量:"abc"、"a"、"b"、"中国"
❤️其中字符型和字符串型都是描述了现实世界中的文字:
⭐️需要注意的是:
所有的字符型只能使用单引号括起来;
所有的字符串型只能使用双引号括起来;
字符型一定是单个字符才能成为“字符型”;
字符串型既可以单个字符也可以是多个字符;
⭐️在语法级别上怎么区分字符型和字符串型?
主要看是双引号还是单引号。
单引号的一定是字符型。
双引号的一定是字符串型。
❤️分析:如果只有字面量,没有变量机制的话,有什么问题?
⭐️例如:10 是一个整数型数据,在内存中占有一定的空间(CPU 内存 硬盘)要计算10 + 20 = 30,需要在内存中找一块空间存储10,再找一块空间存储20,CPU负责“+”运算,算完之后的结果是30,那么这个30也会在内存当中找一块临时的空间存储起来。
⭐️思考:以下的三个10在内存当中是一块空间,还是三块不同的空间呢?
以下虽然都是10,但是这3个10占用三块不同的内存空间。
1. System.out.println(10); 2. System.out.println(10); 3. System.out.println(10);
⭐️总结:只有“字面量”机制的话,是远远不够的,因为只有字面量内存是无法重复利用的
🏀2.变量
// 定义、声明一个变量,起名i int i = 1000; System.out.println(i); System.out.println(i); System.out.println(i);
⭐️以上这3次访问都是访问的同一块内存空间。这样使用变量之后,内存空间就得到了复用。这就是定义变量的好处!
🥅变量的概述
❤️什么是变量?
⭐️变量其实就是内存当中存储数据的最基本的单元。
⭐️变量就是一个存储数据的盒子。
❤️在java语言当中任何数据都是有数据类型的,其中整数型是:int;浮点型:double等
❤️数据类型有什么用呢?
⭐️注:不同的数据类型,在内存中分配的空间大小不同。
⭐️也就是说,Java虚拟机到底给这个数据分配多大的空间,主要还是看这个变量的数据类型。根据不同的类型,分配不同大小的空间。
❤️对于int这种整数类型,JVM会自动给int分配4个字节大小的空间。
⭐️1个字节=8个比特位;1个比特位就是一个1或0。
⭐️注意:比特位是二进制位。所以1个int占有32个二进制位(bit位)
⭐️int i = 1; 实际上在内存中是这样表示的:00000000 00000000 00000000 00000001
❤️对于一个变量来说,包括三要素:类型+名字+值;例如:int i = 10
⭐️变量的数据类型;类型决定空间的大小。
⭐️变量的名字; 名字是为了以后方便访问。
⭐️变量中保存的值;值是变量保存的数据。
❤️变量名属于标识符
⭐️首字母小写,后面每个单词首字母大写,遵循驼峰命名方式,见名知意。
⭐️例如:int i = 10;int nianLing = 20
❤️变量怎么声明/定义,语法格式是什么?
⭐️数据类型 变量名; 例如:int nianLing;
⭐️在java语言中有一个规定,变量必须先声明,再赋值才能访问。
(没有值相当于这个空间没有开辟。)
⭐️例如:
public class Var{ public static void main(String[] args){ //1.先声明,在赋值 int nianLing; nianLing = 20; System.out.println(nianLing);//20 //还可以继续重新赋值 nianLing = 80; System.out.println(nianLing);//80 //2.边声明,边赋值 int weight = 70; System.out.println(weight);//70 } }
🥅变量的使用、分类和作用域
❤️先理解域的含义
1. {A域 2. {B域 3. {C域 4. } 5. } 6. }
⭐️一个大括号代表一个域。
⭐️在“同一个域”当中,变量名不能重名!并且在当前域定义的变量,出了这个域就销毁了。
❤️例1:
public class VarTest03{ public static void main(String[] args){ // 在这里可以访问k变量吗? // 注意:方法体当中的代码遵循自上而下的顺序依次逐行执行。 // 所以以下程序编译报错。 System.out.println(k); //错误: 找不到符号 // 只有执行了这一行代码,k变量在内存中才会开辟空间。 int k = 10; } }
⭐️对于一个变量我们一定要先声明再赋值,才能够访问;所以一定要注意代码运行的顺序!
⭐️这里主要掌握报错的信息!错误: 找不到符号;这样以后编写代码出现相同的错误就会知道问题所在!
补充:编译所有的.java文件,javac *.java
❤️例2:
// 重要的结论:在同一个域当中,变量名不能重名,不能重复声明。 // 变量可以重新赋值,但在同一个域当中,不能重复声明。 public class VarTest04{ public static void main(String[] args){ // 声明一个整数型的变量起名nianLing,存储值20 int nianLing = 20; System.out.println(nianLing); // 给变量重新赋值 nianLing = 30; System.out.println(nianLing); // 错误信息:错误: 已在方法 main(String[])中定义了变量 nianLing int nianLing = 100; System.out.println(nianLing); //err,是在同一个方法体重定义相同的变量 } }
⭐️在同一个域中,可以对同一个变量进行重新赋值;但是不能重新定义相同的变量名!
❤️例3:
// 编译报错:类型不同,i变量也不能重复。(和类型没有关系。不能同名。) public class VarTest05{ public static void main(String[] args){ // 整数型 int i = 100; System.out.println(i); // 浮点型(带小数的) // 错误: 已在方法 main(String[])中定义了变量 i double i = 1.2; System.out.println(i);//err } }
⭐️计算时不同的类型,也不能定义相同的变量名!总之要杜绝定义相同的变量名!
❤️例4:
// 一行上可以同时声明多个变量 public class VarTest06{ public static void main(String[] args){ // 声明三个变量,都是int类型,起名a,b,c // 通过测试得出结论是:a,b没有赋值,c赋值100 int a, b, c = 100; //1.错误: 可能尚未初始化变量a System.out.println(a);//未初始化,编译器会报错 //2.错误: 可能尚未初始化变量b System.out.println(b);//未初始化,编译器会报错 //3.正确 System.out.println(c); // 给a、b赋值,然后才可以调用 a = 200; b = 300; System.out.println(a);//初始化后就可以正常访问了 System.out.println(b);//初始化后就可以正常访问了 } }
⭐️可以一行声明多个变量,变量与变量之间用逗号隔开,最后以分号结尾
⭐️例如:int a,b,c=10; 表示定义三个整型变量,但是只有c初始化赋值了可以直接调用;a和b要想使用必须先初始化一个值,才能被调用!
❤️例5:
(1)变量根据出现的位置进行划分:
在方法体当中声明的变量:局部变量。
类体内声明,在方法体之外的变量:成员变量。
(2)注意:局部变量只在方法体当中有效,方法体执行结束该变量的内存就释放了。
public class VarTest07{ //1.在类体重声明:成员变量 int i = 100; // 主方法 public static void main(String[] args){ //2.在方法体重声明:局部变量 int k = 100; // 在方法体中声明,main方法结束k内存空间释放。 } }
⭐️变量主要分分为两种:成员变量和局部变量
在类体内,方法体之外声明的是:成员变量;成员变量又分为:实例变量和静态变量
在方法体内声明的是:局部变量,并且局部变量只在当前的方法体中有效;
public class Test { //1类体中声明---成员变量-----默认会赋初始值 //1.1没有static修饰---实例变量 int x; //1.2有static修饰---静态变量 static int y; public static void main(String[] args) { //2.方法体中声明---局部变量-----默认不会赋初始值 //局部变量---直接就能访问 int i = 10; System.out.println(i); //实列变量---需要new对象才能能访问 Test t = new Test(); System.out.println(t.x); //静态变量---可以直接用“类名.”进行访问 System.out.println(Test.y);//因为是本类当中,所以Test还可以省略 } }
❤️例6:就近原则(成员变量和局部变量)
(1)变量的有效范围:出了大括号(当前作用域)就销毁了
(2)java中有一个很重要的原则:就近原则
public class VarTest08{ //1.定义在类体中:成员变量 static int i = 10000; public static void main(String[] args){ //2.定义在方法体中:局部变量 //i的有效范围是main方法 int i = 100; System.out.println(i); //100,就近原则 } //这个方法怎么定义,后面会学习。 public static void x(){ //3.定义在方法体中:局部变量 //i的有效范围x方法 //所以这个i和main方法中的i不在同一个域当中。不冲突! int i = 200; } //4.在for循环里定义变量,n作用域只在for域 for(int n = 0; n < 10; n++){ } // for循环执行结束之后,在这里访问n变量可以吗? System.out.println(n); //错误: 找不到符号,不能继续访问n //这里声明的n变量只属于for域。for结束后n释放没了。 //5.在for循环外定义变量,作用域实际上在main域 int k = 0; for(k = 0; k < 10; k++){ } System.out.println(k);//可以继续访问k //这里就能正常访问 }
⭐️定义子在类中体的变量(成员变量)和定义在方法体中的变量(局部变量),就算变量名相同,也不会冲突;可以正常编译。
⭐️定义在不同方法体中的相同变量,也不会冲突;可以正常编译。
⭐️对于成员变量和局部变量,根据就近原则,优先访问局部变量。
🥅小试牛刀
❤️输出学生信息包括:学号、姓名、性别、身高
public class Stu{ public static void main(String[] args){ //学号,定义整型用int int number = 1234; System.out.println("学号:"+number);//+号,类似于两个字符串进行拼接 //姓名,定义为字符串型String String name = "张三"; System.out.println("姓名:"+name); //性别,定义为字符型char char sex = '男'; System.out.println("性别:"+sex); //身高,定义为浮点型height double height = 1.85; System.out.println("身高:"+height); } }