知识点框架:
字面量
字面量说得通俗一点就是数据,例如:123, "中国",false,3.14等等。在我们的现实生活中每天都会与数据打交道,今天买了50块钱的水果,水果重3.2公斤,今天明明是星期一,你却说是星期二,显然你在说谎 (false)。计算机最厉害的地方就在于处理数据的能力,一门编程语言首先要能够表示数据,才能去处理数据,所以在java中通过字面量来表示数据。
为了满足生活中需要,数据就会被分类,根据数据的类别,就有了不同的数据类型。
数据被分为:整型,浮点型,字符型,布尔型,字符串等。
整型:(整数)1 100 1000 10000
浮点型:(小数)3.14 ,1.0 ,3.1
字符型:(单个文字,字符)'a' , '国'
布尔型:(真假)true,false
字符串型:(多个字符)"欢迎来到中国"
public class ConstTestDemo {
public static void main(String[] args) {
System.out.println("我爱中国");
System.out.println(110);
System.out.println(3.14159);
System.out.println("不好好学习,就要回家卖红薯");
System.out.println(true);
System.out.println(false);
System.out.println('男');
System.out.println('A');
System.out.println("ab");
}
}
注意:Java中规定字符型字面量必须用英文状态下的单引号括起来,字符串型字面量则是采用英文状态下双引号括起来。
这个是用IDEA演示的,编译报错了。因为在java语言中字符型只能是单个字符,多个字符则是字符串,应该使用英文状态下的双引号括起来。以上程序中编译器检测到 'ab' 之后,发现以单引号开始,会认为后面是一个字符,于是去a后面找另一半单引号,结果未找到结束的单引号(因为结束的单引号在b后面),所以编译器报错,提示信息是'' 未结束的字符文字 ''。
变量概述:
变量是内存当中存储数据最基本的单元,将数据放到内存当中,给这块内存空间取一个名字,这就是变量。
变量就是内存当中的一块空间,这块空间有类型,名字,数据(值),这也是变量必须具备的三个要素。
变量的本质就是一块内存空间,而数据类型则是决定这个变量内存空间的大小。
变量里面存储的数据需要和数据类型保持一致。
变量,就是可以发生改变的量,即:内存中存储的数据可以发生改变:例如:
public class ConstTestDemo2 {
public static void main(String[] args) {
int age = 18;
age = 20;
System.out.println(age); //20
}
}
变量的使用:
使用变量之前先声明变量,语法格式:
数据类型 变量名;
public class ConstTestDemo2 {
public static void main(String[] args) {
int age;
System.out.println(age);
}
}
可以看到上述代码中 age 变量的三要素只具备了两个要素:数据类型和变量名,缺少了字面(变量里面没有存储数据),这个变量是不能够访问的。像IDEA这样的编译器连编译都通过不了,如下图的红色箭头这样。
运行结果:
得出结论:在java语言中,变量必须先声明,在赋值才能访问;采用“ =”进行赋值。
赋值语法格式:
变量名 = 值;
需要注意的是值的数据类型必须和变量的数据类型保持一致。例如:
java当中允许一次声明多个同类型的变量:
public class ConstTestDemo2 {
public static void main(String[] args) {
int a = 10, b = 20, c = 30;
System.out.println(a); //10
System.out.println(b); //20
System.out.println(c); //30
}
}
将代码稍微改动一下,这是修改之后的代码:
public class ConstTestDemo2 {
public static void main(String[] args) {
int a,b,c = 100;
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
//修改后的代码编译不能通过,可以自行尝试一下
//定义了三个变量分别叫 a ,b,c,并且给c 赋值为100
//此时a,b 都没有赋值,不满足变量的三要素,也就是说,在访问之前要给变量赋值才能访问
变量的分类:
变量根据位置不同可以分为;局部变量和成员变量。在方法体当中声明的变量以及方法的参数都是局部变量。在方法体外且在类体内部声明的变量叫成员变量,成员变量如果使用static关键字修饰则称为静态变量,如果没有static关键字修饰则称为实例变量。
public class ConstTestDemo3 {
int a = 20; //实例变量
static int b = 100;//静态变量
public static void sum(int a, int b) { //局部变量
}
public static void main(String[] args) {
int c = 50; //局部变量
}
}
变量的作用域:
局部变量只有在方法体内部有效,方法执行的时候局部变量的内存才会被分配(类似一个婴儿出生),当方法执行结束之后,局部变量的内存就会被释放(类似于一个老人去世)。例如:
public class ConstTestDemo4 {
public static void main(String[] args) {
int age = 24;
}
public static void fun() {
System.out.println(age);
}
}
//首先给出结论,这段代码编译都是不能通过的
// 找不到符号:变量age
//原因分析因为age 是局部变量,出了main函数就被释放了,
//被释放了之后就不复存在,当在fun函数里面去访问的时候就找不到这个变量age,
//即编译器的运行结果:找不到符号:变量age
那如果将age 声明为静态变量,代码如下:
public class ConstTestDemo4 {
static int age = 24;
public static void main(String[] args) {
System.out.println("main age" + "=" + age);
}
public static void fun() {
System.out.println("fun age" + "=" + age);
}
}
运行结果
:
为什么只有main方法当中输出了age,因为main()函数是程序的入口,而fun()函数没有手动的去调用它,所以就不会被执行到
在同一个作用域之中:变量名不能重复:
public class ConstTestDemo5 {
public static void main(String[] args) {
int a = 1;
int a = 1;
}
}
//连编译都不通过
局部变量和成员变量同名时,遵循 '' 就近原则 '' 局部变量优先:
public class ConstTestDemo5 {
static int a = 10;
public static void main(String[] args) {
int a = 1;
System.out.println(a); //1
}
public static void fun() {
System.out.println("fun" + "=" + a); //10
}
}