首页 > 代码库 > java se的那些细节
java se的那些细节
局部变量:方法体内或语句块内,不能有修饰符
成员变量:与类的对象共存,可以有修饰符
类属性:与类共存,可以有修饰符
一、局部变量:必须先赋值,才能使用,如果不赋初值,则会报错,即没有默认的始使值,而基本数据类型的类属性或成员变量则不会,他们通过编译以后被赋与默认值。
程序1:
public class Test{
public static void main(String[] args){
float f;
System.out.println(f);
}
}
被赋与的值如下:
局部变量: 没有默认值,必须存在值才能使用
属性: javac编译完成后,指定默认值
整数 :0
浮点数:0.0
字符型: \u0000 ‘‘
布尔型: false
引用类型: null
程序2:
public class Test5{
static int a ;
public static void main(String[] args){
float f=0;
System.out.println(f);
System.out.println(a);
new Test();
}
}
class Test6{
int a;
public void Test6(){
System.out.println(a);
}
}
二、尽量不要使用小数比较,原因如下
程序:
public class Test{
public static void main(String[] args){
float f = 0.6f;
double d = 0.6;
System.out.println(f==d);
}
}
double是双精度小数,float是单精度小数,所以得出来的二进制数肯定是不相同的,所以结果为两个相同的数字不相同,如果一定要比较,则按同一类型的小数进行比较。
float和double类型数据可以使用科学记数法表示,如
float f = 3.14e3f---3.14X10的3次方
double f1 = 3.14e-3---3.14X10的负3次方
三、编译期优化:
编译期优化,能够确定结果直接给定结果,不能确定运行确定结果
比如:int a = 3+4;
int b = a+3;
在编译期,a的值就会直接计算出来,而b的值则不会被计算出来,在编译期,只检查第二行的语法是否正确,在运行时才能得出结果。
四、特别容易出错的地方:
short a=3;
short b=3;
short c = (short)(a+b);
这里一定要有强制转换,如果没有强制转换,则会提示错误
第三行即使写成short c = (short)a+(short)b;也是不行的,也会报上面的错误
同理,char和byte也是一样要进行强制转换的。
五、八进制,十六进制
八进制:int a = 033;(在数字前面加个0-零,表示是八进制数)
十六进制:int a = 0x33;(在数字前面加0x-零x,x大小写都可)
六、转义字符(没有办法直接搞出来的)
char 类型用来表示在Unicode编码表中的字符。占两个字节
\\表示的是\
\”表示的是”
\’表示的是’
\n表示的是换行
\t表示的是tab
额外,
public class TestChar {
/**
* @param args
*/
public static void main(String[] args) {
char ch=‘中‘;
String s = "中国";
// System.out.println(ch+‘\‘‘+"...");
// System.out.println(s+ch);
System.out.println(ch+6+"");
System.out.println(""+ch+6);
}}
原因:虽然有String类型的时候,输出结果一定为String类型,但是第一个输出的String类型在后面,程序执行前面的时候还是int类型,把结果计算出来以后再往后面执行的时候碰到””才内部强制转换为String类型,而第二个输出则是在开始的时候就碰到String,所以在这以后都是String类型的拼接。这在输出大范围数和小范围数中也同样适用,要把大范围数提前,这样可以避免多次类型转换,也可以防止当前面多个的小范围数据运算时数据溢出。
七、数学余数问题
public class TestYuShu {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(5%(-2));
System.out.println((-5)%2);
System.out.println((-5)%(-2));
System.out.println(5%2);
}}
输出结果为:
规律:余数的正负与被除数相同,虽然不知道为什么,但还是记下吧,以备以后会用到。
八:a++与++a的问题
程序:
public class TestA {
/**
* @param args
*/
public static void main(String[] args) {
int a = 3;
a=a++;
System.out.println(a);
a=3;
a=++a;
System.out.println(a);
}}
结果:
将在等号前面的a看成是另外一个int类型的数值b,然后再按照相同的思维把b再符赋值给a,就可以得出上面的结果了。
九:扩展运算符:+= -= *= /= %=
优点:简化了代码,对代码进行了优化:
程序:
public class TestExtend {
/**
* @param args
*/
public static void main(String[] args) {
byte c1=34;
byte c2=56;
c2+=c1;
System.out.println(c2);
c1=34;
c2=56;
c2=(byte)(c2+c1);
System.out.println(c2);
}}
结果:
从上面的程序可以看出,使用扩展运算符的代码不能进行强制转换了,jdk内容会自动进行转换的,但是如果不用的话,则自己必须进行强制转换,否则编译通不过。
十:逻辑运算符:操作数只能为boolean类型
位运算符(按位运算):& | ~ ^ >> >>> <<<
& | --> 与&& || 区别:
1、普通与 或 所有的表达式都会参与运算
2、可以使用在 int |boolean 上~ : 取反
^ : 异或 相同为0 ,不同为1
任何整数 ^ 自己 =0
十一、代码的优化:
把当前的工作做好后,看看是否可以对其进行优化,比如减少代码的行数等,或者考虑性能方面的优化。