计算机编程语言有很多种,但最本质的东西都是相同的。如果想要了解一个语言,无非就是几个方面:关键字、标识符、注释、常量和变量、运算符、语句、函数、数组。下面就说一下Java的这几个方面。
1. 关键字:Java挑选了一些特定的英文单词,并赋予其特殊的含义。如:class、inteface、public等等。
2. 标识符:标识符从字面上来看就是标识一件事物的符号,在Java中一般是变量名称、方法名称、类名称等等,由程序员自定义。Java标识符的定义要满足三个条件:(1)标识符由英文字母、数字、_、$组成(2)不能以数字开头(3)不能使用关键字。
3. 注释:Java当中的注释分为三种:单行注释、多行注释、文档注释。注释的作用包括:(1)注解说明(2)调试程序,确定问题点在哪段代码。另外文档注释的对象可是类、变量、方法,使用JDK提供的javadoc工具可以轻松提取文档注释的内容和被注释的对象内容,并生成类似JDK文档一样格式良好的说明文档,以便客户端程序员阅读使用。
4. 常量和变量:常量就是固定不变的量,变量是内存中的一块空间,有自己的名称和类型,其中的数据是变化的常量。不管是常量还是变量,都有自己的类型。Java提供的基本类型有八种,分别是:整数型(byte--1*8bit、shor-t-2*8bit、int--4*8bit、long--8*8bit)、小数型(float--4*8bit、double--8*8bit)、字符型(char--2*8bit)、布尔型(boolean)。
其中,Java中整数类型默认是int、小数类型默认是double。Java是一个强类型语言,一般来说不同类型的数据是无法进行运算的,但是数值类型除外。有时候参与运算的数据数值类型不同但是也能进行运算,是因为有自动类型提升和强制类型转换的支持。一个小的数据类型和一个大的数据类型进行运算,就会先将小的数据类型前面位数补全,提升为大的数据类型,然后进行运算,运算结果是大的数据类型。
特殊案例:
案例1:byte b = 3;
编译结果:
正常
执行结果:
正常
解释:
3在Java当中默认是int类型,因为3是一个常量,编译器可以对该数值大小进行判断,发现3在byte的表示范围之内,就放心大胆的放行了。在真正执行的时候,会只保留3的低八位bit,并赋值给变量b。
案例2:byte b1 = 3;
byte b2 = b1 + 4;
编译结果:
不通过
执行结果:
无
解释:
首先第一句正常通过编译,第二句里由于b1是变量,对于b1+4这个数值大小无法进行判断,所以编译器提醒程序员右侧数据可能会超过byte的表示范围,即可能损失精度。
案例3:byte b1 = 3;
byte b2 = 4;
byte b = b1+b2;
编译结果:
不通过
执行结果:
无
解释:
前两句编译通过,问题就出在第三句。编译器发现b1和b2都是byte类型的变量,两个byte类型的数据加起来就有可能超过byte所能表示的数据范围,所以编译器报错,即可能丢失精度。
案例4:int a1 = 3;
int a2 = 4;
int a = a1+a2;
编译结果:
正常
执行结果:
正常
解释:
为什么案例(4)跟案例(3)表现形式一样,编译执行结果却不同?因为int是Java中的默认整数类型,对于右侧的a1+a2编译器干脆就不检查是否会超过int的数据表示范围了,等真正运行的时候,如果右侧数据超过了int的数据表示范围,那么直接忽略高位强转为int类型。这就是Java对于默认数据类型的特殊处理方式。
案例5:char c = 'a';
syso(c+1);
编译结果:
正常
执行结果:
98
解释:
计算机最初是由老美发明的,计算机对于数据的表示就是一系列的 0 1 串,为了建立一个 0 1 串跟现实生活中文字的映射关系,就选取了一个 0 1 串的长度,既能表示足够的文字,又不会太长,最后选定16bit,即两个字节,现实生活中的字母、数字都对应到一个具体的 0 1 串,于是就确定了一张码表,这就是ASCII码表。计算机普及到中国,中国一看不支持中文这哪行,于是确定了码表gb2312,后来为了支持更多的中国文字不断扩展,后来有了GBK。其实,每个国家都有自己的码表,每个国家的码表基本都兼容ASCII码表,因为字母、数字基本每个国家都使用。Java里实际上内置的码表是unicode码表,这是一样国际码表,兼容了大多数国家的文字。如此说来,字符在unicode码表当中就是对应一个 0 1 串,二进制的 0 1 串就可以表示成一个数,就可以跟i数值类型的数据进行运算了。
5. 运算符
(1)算术运算符(+ - * / % ++ --)
特殊案例:
案例1:int a = 3, b;
b = a++;
syso("a="+a);
syso("b="+b);
编译结果:
正常
执行结果:
a=4
b=3
解释:
因为++在a后面,所以a要预留出最原先的值3参与其他运算(在这里是赋值运算),a++运算完毕a变为4,然后a预留的值3赋给b。
效果等同于:int a = 3,b,temp;
temp = a;
a++;
b = temp;
而如果++在a前面则不会有数据预留的情况。
(2)赋值运算符(= += -= *= /= %=)
特殊案例:
案例1:byte b = 3;
b = b + 1;
编译结果:
不通过
执行结果:
无
解释:
首先第一句正常通过编译,第二句里由于b1是变量,对于b1+1这个数值大小无法进行判断,所以编译器提醒程序员右侧数据可能会超过byte的表示范围,即可能损失精度。
案例2:byte b = 3;
b += 1;
编译结果:
正常
执行结果:
正常
解释:
面对+=一类的赋值运算符,编译器直接放行,等到执行的时候,如果右侧数据超过左侧数据类型的表示范围了,直接强转。