首页 > 代码库 > java se的那些细节

java se的那些细节

局部变量:方法体内或语句块内,不能有修饰符

成员变量:与类的对象共存,可以有修饰符

类属性:与类共存,可以有修饰符

 

一、局部变量:必须先赋值,才能使用,如果不赋初值,则会报错,即没有默认的始使值,而基本数据类型的类属性或成员变量则不会,他们通过编译以后被赋与默认值。

程序1:

public class Test{
    public static void main(String[] args){
        float f;
        System.out.println(f);
    }
}

image

 

被赋与的值如下:

局部变量: 没有默认值,必须存在值才能使用
属性: 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);
    }
}

image

 

 

二、尽量不要使用小数比较,原因如下

程序:

public class Test{
    public static void main(String[] args){
        float f = 0.6f;
        double d = 0.6;
        System.out.println(f==d);
    }
}

image

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);

这里一定要有强制转换,如果没有强制转换,则会提示错误

image

第三行即使写成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);
       
    }

}

image

原因:虽然有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);
    }

}

输出结果为:image

规律:余数的正负与被除数相同,虽然不知道为什么,但还是记下吧,以备以后会用到。

 

八: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);
    }

}

结果:image

将在等号前面的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);
    }

}

结果:

image

从上面的程序可以看出,使用扩展运算符的代码不能进行强制转换了,jdk内容会自动进行转换的,但是如果不用的话,则自己必须进行强制转换,否则编译通不过。

 

 

十:逻辑运算符:操作数只能为boolean类型

 

 

位运算符(按位运算):& | ~ ^ >> >>> <<<
& | --> 与&& || 区别:
1、普通与 或 所有的表达式都会参与运算
2、可以使用在 int |boolean 上

~ : 取反
^ : 异或 相同为0 ,不同为1
    任何整数 ^ 自己 =0

 

 

十一、代码的优化:

把当前的工作做好后,看看是否可以对其进行优化,比如减少代码的行数等,或者考虑性能方面的优化。