2-变量
1. 8种基本类型
- 整型(4种)
- 字符型(1种)
- 浮点型(2种)
- 布尔型(1种)
2. 整型变量
- 类型:byte / short / int / long
类型 | 缺省值 | 长度 | 数的范围 |
---|---|---|---|
byte | 0 | 8位 | -128~127 |
short | 0 | 16位 | -32768~32767 |
int | 0 | 32位 | -2,147,483,648 ~ 2,147,483,647 |
long | 0 | 64位 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
计算方法(以byte为例): |
-
最高位为符号为:0正(准确来说是非负),1负
-
用于表示数值的只剩7位
-
最大正数(等比数列求和):$$ 0(1111111)= 2^ 7-1= 127$$
-
0的二进制数:$$0(0000000)= 0$$
-
最小负数:$$1(0000000)=-2^{(8-1)}+(0000000)_{(2)}作为无符号数的十进制值$$
-
即:$$1(0000000)=-128+0=-128$$
-
计算公式:$$-2^{n-1}~2^{n-1}-1$$
-
问:为什么1(0000000)表示-128?
-
答:
- 由于0已经由0(0000000)表示,故无需用1(0000000)表示-0
- 若表示-127,由于补码中的1(0000001)表示-127,而1(0000000)=1(0000001)-1=-128,因此赋予它-128
- 由于正数中127+1(01111111+00000001=10000000)会溢出为-128
3. 字符型
- 表示:单引号
- 长度:16位(和short一样)
- 只能存放一个字符,超过一个就会报错
4. 浮点型
- 两种类型
- float长度为32位
- double 长度为64位
- 注意:
- 默认的小数值是double类型的
- 举例:
float f = 54.321f
不加f会默认为bouble类型,超出float的长度
类型 | 缺省值 | 长度 | 数的范围 |
---|---|---|---|
float | 0.0 | 32位 | $$3.4\times10^{-38}\sim 3.4\times10^{38}$$ |
double | 0.0 | 64位 | $$1.7\times10^{-308}\sim 1.7\times10^{308}$$ |
5. 布尔类型
- boolean真正存放的数据是0(false)和1(true), 但是,不能直接使用0 1进行赋值
类型 | 缺省值 | 长度 | 数的范围 |
---|---|---|---|
boolean | false | 1位 | false, true |
6. String类型
- String 其实不是基本类型,但是由于被广泛使用,常常被误认为是一种基本类型。
- String类型是Immutable的, 一旦创建不能被改变。
- 注意:
- 创建字符串,->构造函数创建一个字符串对象
- String被final修饰,所以是不能被继承的
- immutable, 一旦创建,不能改变,就像一个常量
- 字符串格式化
package character;
public class TestString {
public static void main(String[] args) {
String name ="盖伦";
int kill = 8;
String title="超神";
//直接使用+进行字符串连接,编码感觉会比较繁琐,并且维护性差,易读性差
String sentence = name+ " 在进行了连续 " + kill + " 次击杀后,获得了 " + title +" 的称号";
System.out.println(sentence);
//格式化字符串
//%s表示字符串,%d表示数字,%n表示换行
String sentenceFormat ="%s 在进行了连续 %d 次击杀后,获得了 %s 的称号%n";
String sentence2 = String.format(sentenceFormat, name,kill,title);
System.out.println(sentence2);
}
}
7. 字面值
- 什么是字面值
- 创建一个Hero对象会用到new关键字,但是给一个基本类型变量赋值却不是用new。因为基本类型是Java语言里的一种内置的特殊数据类型,并不是某个类的对象。
- 给基本类型的变量赋值的方式就叫做字面值
- 整数字面值
public class HelloWorld {
public static void main(String[] args) {
long val = 26L; //以L结尾的字面值表示long型
int decVal = 26; //默认就是int型
int hexVal = 0x1a; //16进制
int oxVal = 032; //8进制
int binVal = 0b11010; //2进制
System.out.println(oxVal);
}
}
- 浮点数字面值
public class HelloWorld {
public static void main(String[] args) {
float f1 = 123.4F;// 以F结尾的字面值表示float类型
double d1 = 123.4;// 默认就是double类型
double d2 = 1.234e2;// 科学计数法表示double
}
}
- 字符和字符串字面值
public class HelloWorld {
public static void main(String[] args) {
String name = "盖伦";
char a= 'c';
//以下是转义字符
char tab = '\t'; //制表符
char carriageReturn = '\r'; //回车
char newLine = '\n'; //换行
char doubleQuote = '\"'; //双引号
char singleQuote = '\''; //单引号
char backslash = '\\'; //反斜杠
}
}
8. 类型转换
- 低精度向高精度转换
public class HelloWorld {
public static void main(String[] args) {
long l = 50;
int i = 50;
//int比较小,要放进比较大的long,随便怎么样,都放的进去
l = i;
}
}
- 高精度向低精度转换
- 直接将高精度的低N位截断(N位低精度的长度),可能会导致数据正负号变化
- 例如:
int i = 256; // 二进制补码: 00000000 00000000 00000001 00000000
byte b = (byte) i; // 截取最低 8 位 → 00000000 → 十进制:0
- 对比物理内存和逻辑截断
场景 | 物理内存(字节序) | 逻辑截断(强制转换) |
---|---|---|
关注点 | 数据在内存中的字节排列顺序。 | 数值的二进制补码表示。 |
影响范围 | 多字节数据的存储(如 int 、long )。 |
数值的高精度到低精度转换。 |
Java 屏蔽细节 | 开发者无需关心,JVM 处理字节序转换。 | 转换结果由语言规范统一确定,与硬件无关。 |
查看整型对应的二进制的方法
//查看一个整数对应的二进制的方法:
System.out.println(Integer.toBinaryString(i2));
- 注意:
- short / byte / char在进行计算时,会自动转换成int类型
二元运算类型提升规则
-
整数运算:
如果两个操作数有一个为long,则结果也为long;
没有long时,结果为int。即使操作数全为short、byte,结果也是int。 -
浮点运算:
如果两个操作数有一个为double,则结果为double;
只有两个操作数都是float,则结果才为float。 -
注意:int 与 float 运算,结果为 float。
9. 命名规则
- 命名规则
- 变量名只能使用字母/数字/$/下划线
- 第一个字符只能使用字母/$/下划线
- 使用完整的单词命名
- 不能使用关键词,但可以包含关键词(例如:int5)
- 关键词列表
异常处理 | 对象相关 | 字面值常量 | 方法相关 | 包相关 | 未使用的 |
---|---|---|---|---|---|
try | new | false | return | package | const |
catch | extends | true | void | import | goto |
finally | implements | null | |||
throw | class | ||||
throws | instanceof | ||||
this | |||||
super |
基本数据类型 | 循环关键字 | 分支关键字 | 方法、变量和修饰符 |
---|---|---|---|
byte | do | if | private |
short | while | else | public |
int | for | switch | protected |
long | break | case | final |
float | continue | default | static |
double | abstract | ||
char | synchronized | ||
boolean | transient | ||
volatile | |||
strictfp |
10. 作用域
- 变量处于不同的位置,有不同的名称:
- 字段,属性,Field
- 参数
- 局部变量
- 字段,属性,Field
- 当一个变量被声明在类下面,变量就叫做:字段,属性,成员变量,Field
- 作用域:从声明位置开始的整个类
- 注意(
i
和this.i
的区别):
public class Demo {
int i = 1;
public void method(int i) { // 参数名与成员变量同名
System.out.println(i); // 输出的是参数 i
System.out.println(this.i); // 输出成员变量 i
}
}
- 参数
- 位置:声明在一个方法上
- 作用域:该方法内的所有代码
- **注意:**其他方法不能访问该参数,类里面也不能访问该参数
- 局部变量:
- 位置:声明在方法内的变量
- 作用域:声明位置开始,到其所处的块结束位置
11. final
final
修饰一个变量,有很多种说法,比如不能改变等等- 准确描述是:当一个变量被
final
修饰的时候,该变量只有一次赋值的机会
- 准确描述是:当一个变量被
- 在声明的时候赋值
- 在声明的时候没有赋值
- 在后面的代码里可以进行唯一一次的赋值
- 拓展:
final
修饰其他,比如修饰类,修饰方法 - 注意:
- 若修饰的是基本变量,则无法修改;若修饰的是引用类型,引用对象内部的状态可以修改
final List<String> list = new ArrayList<>();
list.add("Hello"); // 允许:修改对象内部状态
list = new ArrayList<>(); // 报错:不能修改引用
- 不一定是常量 ,只有在编译时已知才是编译期常量,运行时确定的不是编译期常量
12. 表达式
- 以
;
结尾的一段代码,即为一个表达式 ;
也是一个完整的表达式
public class HelloWorld {
public static void main(String[] args) {
//一个空;也是一个表达式
;
;
;
;
}
}
13. 块
- 从
{
开始 到对应的}
结束 - [[]]