引言:认识Java
java的常量,变量,逻辑等
java中的数组特点
java的内存划分
常量
常量类型
字符串常量'abc','hello'
整数常量100,200
浮点数常量2.5,3.14
字符常量:单引号引起来的单个字符'a','w','2','啊'可以是汉字,但是不能什么都没有
布尔常量false,true
空常量null代表没有任何数据(null不能用来打印输出)
基本数据类型数据类型
关键字
内存占用
取值范围
字节型
byte
1字节
-128 ~ 127
短整型
short
2字节
-2^15 ~ 2^15-1
整型
int
4字节
-2^31 ~ 2^31-1
长整型
long
8字节
-2^63 ~ 2^63-1
单精度浮点型
float
4字节
超大(远大于long)
双精度浮点型
double
8字节
超级大
字符型
char
2字节
0~65535(2^16-1)
布尔类型
boolean
1字节
true & false
整数型 byte short int long
浮点型 float double
字符型 char
布尔型 boolean
注意:
字符串不是基本类型,是引用类型
浮点型可能只是近似一个值,而并非是其精确值
数字范围和字节数不一定相关,例如float和long
浮点数默认类型是double,用float,得加F后缀
整数默认为int,用long,要加L后缀
变量
定义变量注意他们的取值范围:
1
2
3byte x = 10; //正确
byte x = 128; //错误
// byte范围在-128~127之间
注意long
1
2long x = 300000000000; // 错误
long x = 300000000000L; //正确
注意float
1
2float x = 2.5; //错误
float x = 2.5F; //正确
注意事项:
变量名不能重复
float和long要加后缀
未赋值的变量不可以使用
使用byte和short要注意右侧的数据范围
变量不要超出变量的取值范围
一定要先声明后使用,java是从上到下执行的
数据类型转换
自动类型转换(隐式)自动完成
数据范围从小到大转换
布尔类型在JAVA中就是布尔,不能运算,不是0,1
强制转换1
2int num = (int)100L;
//带上括号就可以实现强制转换
注意:
强制类型转换要谨慎使用,易发生精度损失、数据溢出
byte/short/char都可以数学运算,都会被首先提升为int来进行运算1
2
3
4
5byte x = 60;
byte y = 50;
byte result = x + y;
//这样会报错
//byte + byte -> int + int -> int != byte
在运算过程中,他们会变为int
可以改成
1int result = x + y;
或者
1byte result = byte(x + y);
运算符
运算符类型
加减乘除 +-*/
取模 %只对于整数有效
自增自减 ++ --
赋值运算符 =
比较运算符 > < == <= >=
逻辑运算符 && || !
三元运算符 ?:
加法多种用法
加法的运算结果是运算范围最大的那一个
char类型的加法会变为int
可以用于字符串相加减
逻辑运算符
逻辑运算符||和&&有短路效果,
如果根据左边已经可以判断得到最终的结果,右侧的代码将不会执行
赋值运算符
赋值运算符隐含一个强制的转换类型
方法
定义格式
1
2
3public static void xxx(){
//方法体
}
调用方法
单独调用 function()
打印调用 System.out.print(function()
赋值调用 int x = function
注意:
void的方法只能单独调用,也可以使用return;直接返回
同c++,可以根据数据类型的不同和参数的数量不同来实现重载。
唯一的区别–可以通过多类型的顺序区别
1
2sum(int a,double b);
sum(double a, int b);
语句结构
基本内容同c语言
区别:
switch(x)其中x只能为
基本数据类型:byte/short/char/int
引用数据类型:String/enum
数组
数组是一种引用数据类型
特点:
一个数组中的数字类型一致
数组的长度在运行期间长度不可改变
初始化:
动态初始化——指定长度
静态初始化——指定内容,自动推算长度‘
创建:1
2
3String[] str;
str = new String[5];//动态
str = new String[]{"a","b","c"};//静态
可以化为一步
1
2
3
4int[] sum = new int[50];
//动态指定长度创建数组
String[] arr = new String[]{"你好啊","你是谁啊"};
//静态指定数组内容创建数组
当使用动态初始化数组的时候,其中的元素会自动拥有一个默认值:规则如下
1
2
3
4
5
6graph LR
整数-->0
浮点-->0.0
字符-->'\u000'
布尔-->false
引用-->null
数组长度:
直接.length即可
1System.out.println(arr.length)
访问:
直接访问数组名,得到该数组对应的内存地址哈希值
1[I@1b6d3586
传递数组参数
1public static void fun(int[] xxx){}
引用:当一个数组赋值给数组时,他们指向同一片内存
1
2
3
4
5int[] arr = new int[5];
int[] arr2 = arr;
arr[0]=1;
System.out.println(arr[0]);// 1
System.out.println(arr2[0]);// 1
数组的长度不可变
1
2
3
4
5
6
7int[] arr = new int[5];
System.out.println(arr.length);//5
arr = new int[10];
System.out.println(arr.length);//10
//这样看似是更改了数组的长度
//其实是创建了一个新的长度的数组
//更改了原先数组指向的地址
内存划分
java的内存主要划分为五个部分
栈(Stack):存放的都是方法中的局部变量,方法的运行一定要在栈当中(方法的参数,或者是方法{}内中的变量,一旦超出作用域,立马从栈内存消失)
堆(Heap):new建立的东西(堆内中的东西都有一个地址,堆内存中的东西都有一个默认值)
方法区(Method Area):存储.class相关信息,包含方法的信息
本地方法区(Native Method Stack):与操作系统相关
寄存器(pc Register):与cpu相关
注意:
当我们提到java的基本类型时,一般都说是八种。但在Thinking in java 这本java圣经中,将void归为基本类型。
倒也可以说得通:
基本类型和引用类型的区别是:
基本类型: 数据在栈中划分内存,值存储在栈上
引用类型: 数据在栈中划分一块内存用来存储其引用(地址),而其真正的数据存放在堆中
而void不可以new出来(因为 Void 的源码中,将构造函数设置为 private 的,所以外部不能 new 对象),void是存储在栈上的,所以将它归为了基本类型
在java的Class反射内有一个方法isPrimitive() ,可以判断是否是基本类型,当我们输入代码void.class.isPrimitive(),它的返回值是true,再一次证明void分为基本类型是有道理的