------- android培训、java培训、期待与您交流! ----------
1、 字符常量可以是任意单个Unicode字符例如:
‘+’ ‘%’ ‘、’ ‘|’‘1’ ‘a’ ‘ ’ (表示空格) ‘杨’
例如:char ss= '杨' ;
2、 java中八进制的整数常量用0开头表示,十六进制的整数常量用0x开头表示。
a) 例如:
int a=016;
System.out.println(a); //输出的是十进制的数a 结果为14 。
int a=0x16;
System.out.println(a); //输出的是十进制的数a 结果为22 。
int a=0x16;
String s=Integer.toHexString(a);
System.out.println(s); //输出的是十六进制的数a 结果为16 。
int a=016;
String s=Integer.toHexString(a);
System.out.println(s); //输出的是十进制的数a 结果为e 。
3、在java中定义一个变量就相当于在内存中开辟了一块存储该变量数据的区域。例如:
数据类型 变量名=初始化值;//在内存中开辟了一块存储该变量数据的区域
数据类型用于指定在内存中开辟的该区域用于存储什么样类型的数据
变量名用于指定该内存区域的名称
初始化值表示目前该内存区域中所存储的数据,而这个数据在以后的程序中是可以改变的
4、 A mod --B = A mod B --A mod B=--( A mod B)
总结:结果只和被模数的符号一样。
例如:
1%-5=1; -1%5= -1; -1%-5= -1;
5、对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。
而对于小数
int a=32;
System.out.println(32/5.0);
执行结果打印 6.4
6、 在java中
short a=5,b=5;
a=a+6;//这一句编译的时候会出错,是因为进行了两步运算。a
//为short型的,而常量6为int型的,(第一步:)a与6
//相加并自动转型为int型的,(实际上,这一步与a为short //类型的,6为int类型的,然后结果为int类型的一点关 //系都没有。只要没有float、double、long类型的数据都符 //合)(第二步)然后赋值给short型的a就会出错了!(这 //一步,jvm不会自动进行强制类型转换,所以出错了)。
b+=6;//这一句编译时不会出错,是因为就进行了一次赋值运算,//(+= :属于赋值运算符)把左右两边的和赋值给了左边就运算了一次,并且在运算时还自动进行了强制类型转换动作(这一点是和a=a+6的最大不同之处)。
System.out.println(a);
System.out.println(b);
7、 对于下面这个程序例子:
class Demo
{
public static void main(String[] args)
{
byte b1=3, b2=4, b;
b=b1+b2; //这一句会出错!!
b=3+4; //这一句不会出错!!这一句相当于byte b1=3;
}
}
---------- javac ----------
Demo.java:6: 可能损失精度
找到: int
需要: byte
b=b1+b2;
^
1 错误
输出完成 (耗时 0 秒) - 正常终止
总结:
表达式的数据类型自动提升在运算时:
A、所有的byte型、short型和char的值将被提升到int型。(不管参与运算的表达式中有没有int型的操作数)
B、如果一个操作数是long型,并且没有float和double类型时,计 算结果就是long型;
C、如果一个操作数是float型,并且没有double类型时,计算结果就 是float型;
D、如果一个操作数是double型,计算结果就是double型。
总结补充:(这里所说的操作数都是对变量来说的,常量不算!)
A、至少有一个操作数是double类型时。计算结果就是double型的;
B、至少有一个操作数是float类型时,并且没有操作数是double类 型。计算结果就是float型的;
C、操作数中没有float和double类型时,也没有long类型。计算结果 就是int型的;(不管操作数中有没有int类型的数据,都符合这 种情况)
D、操作数中没有float和double类型时,但至少有一个是long类型。 结算结果就是long型的。
E、byte b1=4 , b2=5 , b3;
a) b1=b2+4;(出错!!)因为b2+4的结果为int型的啦;
b) b1+=4;(不会出错!!)不会出错的效果相当于b1=4;
c) b3=b1+b2;(出错!!)因为b1+b2的结果为int型的啦;
d) b3=4+5;(不会出错!!)不会出错的效果相当于b3=9;
8、A<<B==A*2(不论正数还是负数都可以这样转换计算。)
A>>B==A/2(整除,当A为正数时可以这样相互转换着 计算;但是当A为负数时,就不能这样计算了。)
例如:-9>>3的结果为-2。而-9/8的结果为-1 。
用<<左移时最低位都是补0;用>>右移时最高位补什么要看被移 数最高位是什么,如果是0那么就补0,如果是1(说明被移数是负数)那么就补1。(也就是说左右移,不改变数的正负性)
9、>>> :无符号右移无论被移数(是正数还是负数)最高位是0 还是1,用>>>右移后最高位都补0
10、java中的取反符号~:使用~取反时,所有位都取反(包括符号位 在内也取反),而对于求一个负数的二进制表现形式时符号位一直 都是1,改变的是除符号位以外的其他二进制位。
11、而对于负数如果要//求该负数的二进制表现形式的步骤:
原码-->反码-->补码时,符号位不变(一直都是1即不用 取反)。
这里的原码是指:符号位为1而其他位为该负数的相反数的二进制码。后面的反码和补码改变的都是除符号位外的其他二进制位。
12、 在java中
~A + 1= -A ~(-A) + 1= A
也即在java中如果求一个负数 -A 的二进制表现形式也可以这 样:
(~A+1) :表示负数-A的二进制表现形式。
13、 A ^ B ^ B=A(不论B是正数还是负数,都是这个结论)
A ^ B = B ^ A (交换律)
A ^ B ^C = A^ ( B ^C ) (结合律)
14、交换两个变量的值(不借助第3个变量)
①方法一:
A = A ^ B;
B = A ^ B;
A = A ^ B;
②方法二:
B = A ^ B;
A = A ^ B;
B = A ^ B;
15、位运算符 ~(非)、^ 、 & 、| 、 >> 、只能用于整数(包括 int ,char ,byte ,short ,long)
16、条件运算符!(非)、^ 、 & 、| 、 && 、 || 。
17、 java中的数制转换问题
/**
*需求:通过键盘输入一个十进制的数,然后转换成十六进制的数
*author@ 蒸发命令
*/
class Demo2
{
public static void main(String[] args)
{
int a=Integer.parseInt(args[0]);//获取要转换的数字键盘输入
int[] b= new int[8];//数组元素用于存储每一位十六进制数
int i=0; //i用来表示数组b中存储了多少位十六进制数
while(a!=0)
{
b[i]=a&15;
i++;
a=a>>>4;//如果为负数的话,保证不会出错!
}
for(int j=i-1;j>=0;j--)
{
if(b[j]<10)
System.out.print(b[j]+" ") ;
else
System.out.print(((char)(b[j]+55))+" ");//这一句应该 //是把大于等于10的十六进制数转换成A~F之间的字符。这一//句相当于 (char)(b[j]-10+65)
}
}
}
18、 对于这种进制之间的转换问题。当右移的时候应该采用无符号右移 >>> 。因为如果采用普通右移 >> 的话,如果这个数为负数,那么这个数右移时最高位补1,那么就永远不会把这个数移完成0。
所以应该采用无符号右移>>>
19、 三元运算符?:与if —else语句。
只要是运算符,它经过运算后最终都会产生并返回一个结果。例如运算符 + 计算完 a+b后肯定会有一个结果产生并返回。
又如赋值运算符= 计算完 a=90后,整个表达式的值是90。例如System.out.println(a=90); 那么打印的结果就是 90。(这是经过验证的!!)
对于三元运算符?:也是一样的。运算完后最终也有一个结果产生并返回。
布尔表达式 ? 值0:值1
若“布尔表达式”的结果为true,就计算“值0”,而且它的结果成为最终由运算符产生的值并返回。但若“布尔表达式”的结果为false,计算的就是“值1”,而且它的结果成为最终由运算符产生的值并返回。
当然,也可以换用普通的if-else语句(在后面介绍),但三元运算符更加简洁。
20、 if —else语句比三元运算符将更加灵活,但是效率没有三元运 算符高。
21、 switch语句中的可选类型只有4种分别为:
(byte 、 short、 int 、 char 没有long,也没有boolean)
switch(表达式)
{
case 取值1:
执行语句;
break;
case 取值2:
执行语句;
break;
case 取值3:
执行语句;
break;
………………
default:
执行语句;
[break;]
}
22、 switch中的case子句和default子句排列是没有固定顺序的。例如也可以这样排列:
switch(表达式)
{
case 取值1:
执行语句;
break;
case 取值2:
执行语句;
break;
default:
执行语句;
break;
case 取值3:
执行语句;
break;
………………
}
default子句、case子句的位置可以在switch范围内的任何地方。但是执行的时候,case子句按自身所在位置来顺序判断是否执行,而default子句不管放到哪里都是最后判断是否执行。另见第5条
23、代码示例:
int a=4;
switch(a)
{
case 4:
System.out.println("4");
default:
System.out.println("default");
case 1:
System.out.println("1");
case 2:
System.out.println("2");
case 3:
System.out.println("3");
case 5:
System.out.println("5");
}
执行结果:
---------- java ----------
4
default
1
2
3
5
输出完成 (耗时 0 秒) - 正常终止
分析原因:
当程序执行到 case 4:时,满足条件,所以执行进入执行System.out.println("4"); 并且依次顺延执行
System.out.println("default");
System.out.println("1");
System.out.println("2");
System.out.println("3");
System.out.println("5");
在if —else if —else语句中最后的else子句可以省略不写;
在switch语句中最后的default子句也可以省略不写!!