随笔-4  评论-4  文章-1  trackbacks-0

1.关键字和保留字:
abstract   boolean  break  byte  case  catch char  class  const  continue  default  do double   else extends  final   finally  float  for goto  if  implements  import  instanceof int  interface  long   native   new  package  private   protected public  return short static
stricfp  super   switch synchronized  this throw enum throws transient  try void volatile  while assert
其中很容易搞混或忽略的是:null、true、false、volatile、native、stricftp、assert、enum、synchronized 、transient、goto(保留字)、const(保留字)
native:指出方法是与平台相关的语言(如C)编写的
stricftp:用在方法或类的前面,指出在所有表达式中的浮点数将尊守严格的FP限制规定
synchronized:指出方法只能同时被一个线程访问  
transient:防止字段被永远串行化。当串行化对象时,总是跳过transient字段
volatile:指出变量可能改变,失去同步,因为它被用在多个线程中。
注意:
(1)在java语言中,英文字母大小写敏感。所以要注意所有的关键字与保留字都是小写的,null是关键字,但NULL不是关键字;
(2)注意true与false在java中也是关键字;
(3)const:不要用于声明常量,请使用public static finalgoto:在java语言中作为保留字,没有使用,因为这个语句被认为是有害的.
(4)注意SIZEOF\Friend不是java中的关键字,不要跟C++搞混。

2.变量命名规则:每个变量的第一个字符必须是字母、美元符号或下划线;特殊符号只能用$,其它特殊字符中有特殊用途的不能出现在字母中,如:+,-,/,*,@,%,^,&,~,#等。以下是正确命名:Java, _java, $java, my_java,java2.以下是错误命名:2java,@java,oh!,%java,java#,#java,^java, my-java,my=java等。

3.整数类型:联想8421码就可以记住了。

byte

8-bit

        -128    ~

+127

Byte

short

16-bit

       -215      ~

+215 – 1

Short

int

32-bit

       -231     ~

+231 – 1

Integer

long

64-bit

       -263    ~

+263 – 1

Long

值得注意的是八进制中不可用8和9两个数字,如果用了,编译将出错,如:018,程序在编译时就会出现“interger number too large"。所以没事就不要打荤,在整数前面乱加0。

4.在表达式中放大类型转换是属于自动类型转换,而缩小类型转换是强制类型转换,但存在数据丢失的危险。道理很简单,小水杯中的水倒进大水杯中肯定没有任何安全问题,相反,大水杯的水倒进小水杯存在装不了所有的水的危险。所以:byte->short->int->short->float->double 这样的顺序是属于放大且自动类型转换,而反过来就是缩小且需要强制类型转换。一般的数据类型转换中要注意的:char也可以放大且自动类型转换成int;boolean数据类型无法转换成其他几各数据类型,而其他数据类型也无法转换成boolean数据类型,切记!!
注意:float f = 1.0; //报错,1.0默认是double,缩小类型需要强制转换,可改成float f = (float)1.0或float f = 1.0f; float f = 12;//正确,放大类型,int自动转换为float.
对于整数来讲,通过算术表达式计算完的结果只会变成int类型!!Why ?因为怕运算后的结果会超出原来数据类型的范围!!
经典的面试题:
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错
?
short s1 = 1; s1 = s1 + 1;
s1+1 运算结果是 int 型,需要强制转换类型)

short s1 = 1; s1 += 1;
(可以正确编译)

5.位运算符中:&,|,^,~,前三个可以两边都是数字或boolean,~不可为boolean,只能是数字: ~ aInt= -aInt - 1;int a 左移n位(放大)等价于a*2^n,右移n位(缩小)等价于a/2^n.

6.swtch-case  只能接收byte、short、int和char类型变量的判断,注意不可使用long类型,网上很多人都把long类型算进去,这是不对的,使用long类型编译时会有报错,至于为什么不可是long呢?(我现在也想不通,你有什么看法,请告知,谢谢!)除了这四个之外,其它的类型都不可用switch表达式中,简言之,只有能够自动转换成int类型的数据类型才行。注意,单个case后面如果没有break的话,程序会往下执行一直遇到break跳出switch.

7.声明一个数组的正确形式:int i[][] ; int[][] i; int[] i[];声明当中不可确定具体的数组个数。如以下声明是错误的形式:int i[3][]; int[3] i;int i[3][3]

8.定义一个数组后,数组会自动初始化为相应的类型初始值,int[] a = new int[5];
a[3] = 0; char[] c = new char[5];c[3] = '\u0000'(终端输出时是空白行)。类中方法级的变量必须先初始化。不然不可以使用,哪怕是Sytem.out.println(string)这样的方法。但数组除外,在方法级中可以直接使用,因为JVM会自动先初始化数组,所以是安全的。说到这,涉及到初始化的问题:
e.g.
public class Test {
    String s2;
    static String s3;
    public Test() {
        System.out.println(s2); //正确,类中属性会自动初始化为null
    }

    public static void main(String[] args) {
        String s1;
        System.out.println(s1); //编译错误,s1未初始化。

        char[] c = new char[5];
        System.out.println(c[3]);//正确,数组已先初始化

        System.out.println(s3);//正确,静态String类型初始化为null 
        System.out.println(s2); //编译错误,静态方法不可调用非静态属性
    }
}

9.调用equals()方法时要注意的地方:如果自定义类时没有overide Object里面的方法equals()那么调用equal()时将默认调用 Object里面的equals().同样,这跟hasCode()和toString()方法也有类似的情况。
e.g.
(1)没有改写equals()方法时:
public class Test {
    int i;
    public static void main(String[] args) {
        Test t1 = new Test();
        Test t2 = new Test();
        t1.i = t2.i= 100;
        System.out.println(t1.equals(t2)); //输出false
    }
}
(2)改写equals()方法后:
public class Test {
    int i;
    public boolean equals(Object obj) {
        Test aInt = (Test)obj;
        return this.i == aInt.i;
    }
    public static void main(String[] args) {
        Test t1 = new Test();
        Test t2 = new Test();
        t1.i = t2.i= 100;
        System.out.println(t1.equals(t2)); //输出true
    }
}
这是为什么呢?难道Ojbect里面的方法equals()就没有实现比较功能吗?我们可以用JDK源代码里看看Object里的equals()是怎样写的:   
public boolean equals(Object obj) {
 return (this == obj); 
}
// 注意这里是比较是否同一个引用!上例中由于t1和t2不是同一个引用,所以就会返回false了。但如果不是自定义类,而是一个封装类,比如Integer类里面是实现了equals()方法了的,那么如果对象中的值若相等的话,用equal()方法比较就会相等。
e.g
public class Test {
    public static void main(String[] args) {
        Integer aInt = new Integer(100);
        Integer bInt = new Integer(100);
        System.out.println(aInt.equals(bInt)); //true
    }
}
why? 看看Interger类的源代码就清楚了:
public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
}
这个问题对于初学者是最容易搞混的。建议看到类似的程序看看JDK的源代码,我觉得,这时看源代码反而比看帮助文档来得更直接了当,也更容易明白个中源由。

.......待续

posted on 2007-03-24 15:50 心中海 阅读(619) 评论(0)  编辑  收藏 所属分类: J2SE