java---03Java语言的基础构成(原创,请勿转载)
1.关键字
- 关键字在Java中被赋予了特殊的含义,比如public void class 等等,Java语言中的关键字全部都是小写的。但这句话可不能搞反了。
2.标识符
- 标识符其实就是在程序中自定义的一些名称。
- 标识符由英文字母,数字以及符号"_"和"$"构成,不能使用空格。要注意:
- 数字不能用作标识符的开头
- 不能使用关键字来定义标识符
- 凡是变量的名称,都是标识符。如main,haha等
3.注释
- Java中的注释有单行注释也有多行注释。
- 单行注释: 由双斜杠"//"开始,作用于本行
- 多行注释: 由 /* 开始,以 */ 结束
- Java特有的文档型注释可以通过Java中的工具javadoc提取,生成说明书。
- 注意:
- 多行注释当中不能再嵌套一个多行注释,因为在编译的时候会多余出一个 " */ "
- 可以利用多行注释来寻找代码出错的范围,并最终确定该错误位置。即注释可以进行程序的调试
- 注释在编译的过程中不会被编译到CLASS文件中去,这一点可以通过比较编译前后class文件的大小看出
- 一个规范的Java文件在进行代码编写class之前,都要进行多行注释,用来说明这个Java文件中代码的意义和思路。具体格式如下
/* 需求:(即代码所要解决的问题是什么——干什么) 思路:(编写代码的核心,找出问题的着手点——怎么干) 步骤:(主要的编程步骤,包括需要用到的变量和方法等) */
class Demo
{
......
}
4.常量——不能改变的数据
- 分类:整数常量、小数常量、布尔型常量、字符常量、字符串常量、null常量
- 注意
- ""和''不等于null,这种字符串或字符称为空字符(串)。null不能有单引号/双引号
5.变量
- 内存中的一个存储区域,并且该区域有自己的名称(变量名)和类型(数据类型),该区域的数据可以再同一个类型范围内不断变化。
- 变量定义之后就不能再定义一个相同数据类型和名称的变量。
- 格式
- 数据类型 变量名 = 初始化值;
- 注意注意!!!
- 在Java中,整数在赋值给变量时默认的是int类型,如果该整数的范围大于了int类型的范围,就需要在整数的后面加上小写字母" l "进行声明,即对过大的数要用字符" l "标识。
- 同理,由于小数在Java默认的是双精度的类型,如果想把小数保存成单精度的float类型,需要在该小数的后面加上字母" f ",声明该数字为单精度的浮点型数据。
6.数据类型(基本数据类型和引用数据类型)
- 基本数据类型:
-
- 数值型:
1.整数类型:byte(1字节,-127~128)、short(2字节)、int(4字节默认)、long(8字节,过大的整数要表示字符 l )
ps: 1).为了方便运算,对整数进行不同程度的划分,对内存的空间能够进行有效的配置。
2).1个字节占用8个bit位 如 0000-0000
如int类型的6在内存中的表示: 0000-0000 0000-0000 0000-0000 0000-0110 -6的表示(正数6先去反,再加1) 取反 1111-1111 1111-1111 1111-1111 1111-1001 + 0000-0000 0000-0000 0000-0000 0000-0001 _____________________________________________________________________ 1111-1111 1111-1111 1111-1111 1111-1010 (注意:负数的二进制最高位是1)
2.浮点类型:单精度float(4字节共32个bit位表示,后面也要声明 f )、默认为双精度double(8字节)
-
- 字符型:char(取值范围在2个字节之内,引号中能装下的整数只能是个数)
-
- 布尔型:boolean
- 引用数据类型:
- 类:class
- 借口:interface
- 数组: []
7.类型提升&强制转换
- 上面介绍到了不同种的数据类型以及他们在计算机内存中的二进制表示方式和所占内存大小。当等式赋值运算的两端数据类型不一致的时候,就会发生自动类型提升和强制类型转换。
- 下面通过举例来分别说明两者:
1).首先,从一个简单的运算入手,
class VarDemo2
{
public static void main(String[] args)
{
int x = 3;
x = x + 5; //把内存空间中的3取出来,在运算区二进制运算3+5 即 011+101 = 1000 ,然后将运算结果赋予给x,此时x内存空间中的数据为8
System.out.printn(x);
}
}
上述代码在内存中的具体运算过程是这样的
PS:运算两端必须是相同类型才能运算(类型不一致,内存空间就不一致)。但是数值类型之间的数可以运算。
2).自动类型提升
class VarDemo2 { public static void main(String[] args) { int x = 3; byte b = 5; x = x + b; //自动类型提升 System.out.printn(x); } }
/*
int 类型的整数在内存中占用了4个字节,也就是32个bit位,而byte类型的整数在内存中只占用1个字节,即8个bit位。
在 x = x+ b 运算时,类型为byte的数据 b 会在内存中自动补齐高位的剩下24个bit位,也就是3个字节,然后在进行运算。
*/
3).强制类型转换
class VarDemo2 { public static void main(String[] args) { byte b = 5; b = (byte)(b + 3); //强制类型转换:将一个int型强制转换成byte型(除去高位的二进制数据,只留下8个bit位参与运算),再复制给byte型变量 System.out.println(b); } }
/*
思路和上面自动类型提升一样,只不过这里是讲等式右边内存较大的int类型的 3 强制去除了其二进制中的高位(前3位字节),然后再进行运算。
*/
7.常量与变量
class VarDemo2 { public static void main(String[] args) { System.out.println(‘a’ + 1); //char在内存中是2位,int在内存中是4位,在没有强制转换的情况下,java会自动的把位数较小的自动转换成位数大的类型 ,然后再进行运算, 1 对应的二进制进行了自动类型转换 System.out.print((char)('a' + 1)); //再指定了输出类型后,对结果 98 进行了强制类型转换 成位数更小的char类型 } } // 运行得到 >>> 98 >>> b
PS:二进制与生活中的文字如字母之间对应关系---->编码表
01100001---> a
01100002---> b
...... ---> ...
class VarDemo { public static void main(String[] args) { byte b = 4; byte b1 = 3; byte b2 = 7; b = b1 + b2; //此处会报错,原因是以为等式右边为变量,变量是不确定的,java编译器无法检查等号右边的值得范围是否超出byte(-128~127),如定义b1之后,又将127赋予b1,会丢失精度。即右边不确定,是无法判断赋值的 //b = 3 + 7; //3 7 为常量,不会报错 } }
class VarDemo { public static void main(String[] args) { int x; int x1 = 898; int x2 = 810; x = b1 + b2; //因为计算结果在java中默认为int,但是当x1 + x2的值超出了int范围的时候,java就会进行强制转换,强制保存int的二进制4个8位,导致截掉了最高位的1 ,得到的会是一个负数 } }