Java基础(1)
在自学java基础的道路上从入门到入土的一只小萌新。。。本系列不定期更新,有不足和错误欢迎各位大佬指正hhh
常量
· 常量的声明:final int a = 2;
· 浮点数:float x = 3.14F(3.14f); // 结尾加f/F
· 常量支持同时赋值:final int a = 4,b = 5,c = 6;
· 在常量已被声明的同时赋值后,再次执行修改其值的代码将报错
final int YOUTH_AGE = 16;
YOUTH_AGE = 18; // 此时会报错
· 在定义变量标识符时,按照java的命名规则,第一个单词的首字母小写,其他单词首字母大写。
String name = "ABC";
int partyMemberAge = 26; // 驼峰式命名法(然而其实本人更习惯下划线命名(?)hhh)
· 变量的值允许被改变。
java的数据类型
整型
· 字节型(byte):1字节,-128~127
· 短整型(short):2字节,-32768~32767
· 整型(int):4字节,-2147483648~2147483647
· 长整型(long):8字节,-9223372036854775808-9223372036854775807
在为长整型常量或变量赋值时,所赋的值后面需要加上一个字母L/l
· 如果所赋的值并未超过int型取值范围也可以省略字母“L”
浮点类型
· 单精度型(float):4字节,-1.4E-45~3.402823E538
· 双精度型(double):8字节,4.9E-324~1.7976931348623157E308
在为double常量或变量赋值时,所赋的值后面需要加上一个字母D/d,java默认小数为double型
字符类型:char
在为char型常量或变量赋值时,如果所赋的值为一个英文字母、一个汉字或一个符号时必须将所赋的值放在英文状态下的一对单引号内。
要注意,无论所赋的值为字母、符号还是汉字,都只能为一个字符。
char ca = 'M';
char cb = '*';
char cc = '男';
由于java会把字符当作整数,并且可以存储65536个字符,所以也可以将0~65535的整数赋值为char型常量或变量,但是在输出时得到的并不是所赋的整数。
也可以将数字0~9以字符的形式赋值给char型常量或变量。
char c = 88;
System.out.println(c);
// 输出:X
char d = '6'; // 6
关于基本输出语句:
System.out.println(); // 打印指定内容至终端并换行
System.out.print(); // 打印指定内容至终端
布尔类型:boolean
布尔值只有true和false,分别用来代表逻辑判断中的“真”和“假”,使用关键字boolean进行声明。
boolean b;
boolean b1,b2;
boolean b3 = true, b4 = false;
boolean b5 = 2 < 3, b6 = (2 == 4);
System.out.println("b5 is:" + b5); // b5 is true
System.out.println("b6 is:" + b6); // b6 is false
引用数据类型
引用数据类型包括类引用、接口引用和数组引用。
Object object = null; // 声明一个java.lang.Object类的引用
List list = null; // 声明一个java.util.List接口的引用
int[] months = null; // 声明一个int型数组的引用
// 声明+具体初始化
Object object = new Object();
List list = new ArrayList();
int[] months = new int[12];
基本数据类型之间的转换
自动类型转换
· 低级数据(取值范围相对较小)类型 -> 高级数据(取值范围相对较大)类型
java会自动完成从低级数据类型到高级数据类型的转换。
数据类型从低到高排序:
byte -> short -> int(char) -> long -> float -> double
分成两种情况考虑:
(1)含有int、long、float或double型的数据
java会先将表达式中所有数据类型较低的变量自动转换为表达式中数据类型最高的数据类型再进行计算,并且计算结果的数据类型,也为表达式中数据类型最高的数据类型。
举个栗子
byte b = 75;
char c = 'c';
int i = 794215;
long l = 9876543210L;
long result = b * c - i + l;
在这个式子中,java会把b、c、i转换为long型在进行计算,并且计算结果的数据是long型。
也就是说,将表达式的结果直接复制给数据类型低于long(如int)型是不被允许的。但是可以直接赋值给数据类型高于long型(如float)型的变量。
(2)含有byte、short或者char的数据
如果是这样的情况,那么java将会把所有的变量的类型转换为int型再进行计算,并且计算结果的数据类型为int型。
还是举个栗子
byte b = 75;
short s = 9412;
char c = 'c';
int result = b + s * c;
在这个式子中,java会先把所有变量的数据类型转换为int型再进行计算,并且计算结果的类型为int型。
也就是说,将表达式的结果直接复制给数据类型低于int(如char)型是不被允许的。但是可以直接赋值给数据类型高于int型(如long)型的变量。
可以将数据类型较低的数据或变量直接赋值给数据类型相对较高的变量,但是不可以将数据类型较高的数据或变量直接复制给数据类型较低的变量。
强制类型转换
如果需要解决上文的问题,就必须进行强制类型转换。
例如下面的例子,我们想要把java默认为小数类型的数据double值7.5赋值给数据类型为int的变量;将默认int型数据774赋值给byte类型的变量。
int i = (int) 7.5; // 7,精度降低
byte b = (byte) 774; // 6,溢出
从运行结果上看,说明这样做会导致数据溢出或者数据精度降低。
为什么会出现数据溢出?
十进制数的774的二进制存储形式:
00000000 00000000 00000011 00000110
前24位被舍弃,截取二进制数据流的后8位
00000110 -> (10进制中的6) 赋值给上文中的变量b
java数组
数组的声明方式
// 一维数组的声明
// 两种声明数组格式的作用相同,但是第一种方式更符合原理,后一种方式更符合原始编程习惯
int[] months;
boolean members[];
// 二维数组的声明
int[][] days;
boolean holidays[][];
数组的创建
创建数组实际上就是在内存中为数组分配相应的存储空间。
int[] months = new int[12];
int[][] days = new int[2][3]; // 可以将二维数组看作一个表格,索引从0开始
数组的初始化
int boy[] = {2,45,36,7,69};
boolean holidays[][] = {{true,false,true},
{false,true,false}};
数组的长度获取与元素的访问
元素的个数称为数组的长度。
对于一维数组来说,“数组名.length”的值就是数组中元素的个数;对于二维数组,“数组名.length”的值是它含有的一维数组的个数。
int[] months = new int[12];
boolean[] members = {false,true,true,false};
int[][] days = new int[2][3];
boolean holidays[][] = {{true,false,true},
{false,true,false}};
// 一维数组长度的获取
System.out.println(months.length); // 12
System.out.println(members.length); // 4
// 二维数组行数
System.out.println(days.length); // 2
System.out.println(holidays.length); // 2
// 二维数组列数
System.out.println(days[0].length); // 3
System.out.println(holidays[0].length); // 3
// 通过{}创建的数组,数组中每一行列数可以不相同
boolean holidays_1[][] = {{true,false,true},
{false,true,},
{true,false,true,false}};
System.out.println(holidays_1[0].length); // 3
System.out.println(holidays_1[1].length); // 2
System.out.println(holidays_1[2].length); // 4
// 数组元素的访问
System.out.println(members[1]); // true
System.out.println(holidays_1[1][0]); // false