您的位置:首页 > 编程语言 > Java开发

JAVA小知识

2016-06-19 18:19 218 查看

JAVA小知识

.class文件又叫类文件保存的是经过javac命令编译后得到的[AVA字][6]节码文件。[JAVA虚拟机JVM][6]可以读取.class文件并把她提供给JAVA解释器][6]执行。.class文件类似window中的.dll文件或Unix中的.so文件,人类肯定读不懂。

为什叫字节码?因为每一个指令码(操作码)只占一个字节(有些操作还可以有参数,即跟随其后的字节流),所以只有256个可用的指令。实际上,有些指令用不到,大概只会使用200个,而且其中还有一些是最新版javac不支持的。

[机器码][6],只有JIT编译才会生成机器码。

Java中\b表示退格符,\t表示水平制表符效果跟按一下tab键差不多。\n换行符,\r是回车符。回车跟换行要牵扯到计算机历史的问题。回车实际上是让光标跑到本行的行首,再输入\n才是让光标跑到下一行。但是JAVA中\r\n才代表一个换行。\f是换页符。

转义符号\ ,java中\能将普通的字符串换成代表特殊意义的符号,比如上面的。还能将有意义发符号转成普通的字符串,比如你要在”“号中打印”符号,就可以”\””这样输入。

java中以0x或0X开头的字面常量是十六进制数,使用字幕A到F(或a到f)表示数字的十六进制形式。十六进制0xff表示十进制数255

java中整数字面量的二进制形式以0b开头,当然,只能使用数字1或0。二进制0b0010_1111表示十进制数47.

java还支持使用八进制表示整数字面量,以0开头,当然了,既然是八进制,肯定是不能使用数字8或9。进制就是到8就进1,咱们的上学就是10进制的,11就是到10了要进用11表示。八进制0377表示的十进制数255

0xCAFEBABE这肯定是一个十六进制的数,因为他是0x开头的。这个是个魔法数,可以用来识别java类文件的数字。每个类文件的开始4个字节都是0xCAFEBABE。这个神奇的数字让Java类文件更容易识别,因为类文件以外的文件几乎不可能也以这四个相同的字节开头。之所以称之为魔法数,是因为它可以被文件格式设计者们从帽子里拉出来(??)。对它仅有的要求是,不能被现实已有的文件格式占用。

**在JAVA中如果整数运算超出了数据类型的数据范围,不会JAVA不会报错,而是直接回绕。就是直接将最小值赋给变量。例如:int 数据类型的范围是-2147483648到2147483647。
int num = 2147483647;

int numSec = num + 1;

System.out.println(numSec);//这里会输入-2147483648,这里输入的int类型的最小值
,但是,long类型几乎不会发生这种情况,不是long不适用这种规则,那是因为long的范围是-无穷大到正无穷大,根本不会超过这个范围,哈哈。float double这俩种几乎也不会。**

float,double如果前面是0的话,是可以省略的。比如,0.01可以写成这样.01。java中小数模仿是double类型的,如果要声明float要在后面加f,f小写大写都可以。例如: float test = .01f;或者float test01 = .02F;小数点的运算从来不会发生异常,整数的运算是不能除以0的。因为0不可以做除数。但是浮点数是可以除以0的。1.0/0的结果是Infinity(正无穷大) -1.0/0的结果是-Infinity(负无穷大),0.0/0的结果是NaN。NaN是Not a Number就是不是一个数字。Double.isNaN()可以判断double的值是否是一个数字

强制类型转换,如果要将小数点强制转换成整形,小数点后面的部分会直接被揭掉,而不是临近舍入。静态方法Math.round(2.4);是根据第一位小数来进行四舍五入的,返回结果是long类型,结果是2。Math.round(2.49);的结果还是2,因为他是根据第一位小数来四舍五入的。Math.round(2.5);结果是3。Math.floor(2.99);是向下取整,返回结果是dobule类型,结果是2.0;floor英文单词是地面的意思。Math.ceil(2.11);是向上取整,返回结果是dobule类型,结果是3.0;ceil英文单词是天花板的意思。

还有i++,++i的意思,相信大部分初学者都被这个i++,++i的值困惑过,接下来让大哥我给你们解释清楚。咳咳,首先如果i++,++i如果不参与运算,做为单独的一行代码执行的话,他们的结果都是自身的值加1之后的值。例如:
int i = 0;

i++;

System.out.println(i);//输入1

int j = 0;

++j;

System.out.println(j);//输入1


接下来说说参与运算的情况:首先你们要明白读和写的概念,也就是运算和赋值的概念。JAVA中"="号的含义:把等号右边的值赋给左边。=号右边是一个运算表达式,=号左边是接收右边的运算表达式运算完后的结果。你们先把上面的汉语看明白,再看下面的例子。


int numI,numQ= 0;//初始值都是0
numI = numQ++;//这里是先赋值,先把numQ(0)的值赋给numI,再运算numQ++。
System.out.println(numI);//numI输入0,因为他先把numQ(0)的值赋给numI了。
System.out.println(numQ);//numQ输入1,numI = numQ++;这行代码numQ++已经运算过了,所以numQ的值为1。
int numJ,numK= 0;//初始值都是0
numJ= ++numK;//这里是先运算,先把numK的值加1,再赋值,再把numK的值赋给numJ。
System.out.println(numJ);//numJ输入1
System.out.println(numK);//numK输入1,这里不用说了,numK的值肯定是1,因为numJ= ++numK;这里是先运算,先把numK的值加1,再赋值
//你们要注意i++,++i是否参与运算表达式,懂吗?
//下面这种其实是一样的。
int arrI = 0;
int [] arr = new int[]{1,2,3,4};
arr[arrI++]++;//这里的arr[arrI++]等于arr[0],先把arrI的值赋给数组的下标索引,等于arr[0]取出的是1,然后1++编程2了,数组的第一个值就变成2了。
System.out.println("数组"+ arr[0]+"数组"+arr[1]+"数组"+arr[2]);//数组2数组2数组3
//下面这个跟上面的效果一样
int arrK = 0;
int [] arrSec = new int[]{1,2,3,4};
arrSec[arrK++] = arrSec[arrK++]++;
System.out.println("数组"+ arr[0]+"数组"+arr[1]+"数组"+arr[2]);//数组2数组2数组3


* 还有== 和equals,大部分初学者对这个东西也是鸡头白脸啊,其实妈的,==比较的就是值引用,如果俩个值的引用指向同一个引用就返回true,否则就返回fasle。如果基本类型,则比较这个俩个类型的值是否一样。如果是引用类型就比较这个俩个类型是否指向同一个引用。其实值类型比较的也是引用,如果你懂堆栈的话。总之==比较的就是引用地址,如果俩个对象的引用地址是同一个,那么==就返回true,明白吧。字符串要用equals比较,equals值比较俩个类型的值是否相等,别的一概不管。你从Object类继承的equals方法,默认的实现方式就是使用==来判断俩个对象的引用是否相等的。对应的引用相等和内容相当要区分开来,俩个对象的引用不相等,但他们的内容是可以相等的。有时候一个只需要判断对象上的几个属性相等,就可以认为这俩个对象相等了,虽然他们的引用不相等,这是属于你们公司的业务上的逻辑判断。*

位运算和位移运算。

位运算和位移运算符是低层运算符,是处理组成整数的单个位。除非处理低层操所(例如网络编程)。若想学会这个,必须先理解二进制数以及用于表示负整数的二进制的补码方式。位运算和位移运算不能操作浮点数,布尔值或者数组或者对象。只能操作int和long类型的数字。

如果位移运算符左边的操作数是long类型,结果就是long类型。否则结果就是int类型。

如果位运算符的操作数中有一个是long类型结果就是long类型。否则,结果都是int类型。

已上内容大部分是从书《Java技术手册》中摘抄过来的,《Java技术手册》[美]David Flanagan [中]安道译
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JAVA i++ ++i equals