初学JAVA易错点1
来源:互联网 发布:转行it 知乎 编辑:程序博客网 时间:2024/06/09 10:10
1.关键字和保留字:
abstract
stricfp
其中很容易搞混或忽略的是:null、true、false、volatile、native、stricftp、assert、enum、synchronized
native:指出方法是与平台相关的语言(如C)编写的
stricftp:用在方法或类的前面,指出在所有表达式中的浮点数将尊守严格的FP限制规定
synchronized:指出方法只能同时被一个线程访问
transient:防止字段被永远串行化。当串行化对象时,总是跳过transient字段
volatile:指出变量可能改变,失去同步,因为它被用在多个线程中。
注意:
(1)在java语言中,英文字母大小写敏感。所以要注意所有的关键字与保留字都是小写的,null是关键字,但NULL不是关键字;
(2)注意true与false在java中也是关键字;
(3)const:不要用于声明常量,请使用public
(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
+127
Byte
short
16-bit
+215 – 1
Short
int
32-bit
+231 – 1
Integer
long
64-bit
+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
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 {
}
9.调用equals()方法时要注意的地方:如果自定义类时没有overide Object里面的方法equals()那么调用equal()时将默认调用 Object里面的equals().同样,这跟hasCode()和toString()方法也有类似的情况。
e.g.
(1)没有改写equals()方法时:
public class Test {
}
(2)改写equals()方法后:
public class Test {
}
这是为什么呢?难道Ojbect里面的方法equals()就没有实现比较功能吗?我们可以用JDK源代码里看看Object里的equals()是怎样写的:
public boolean equals(Object obj) {
}
//
e.g
public class Test {
}
why? 看看Interger类的源代码就清楚了:
public boolean equals(Object obj) {
}
这个问题对于初学者是最容易搞混的。建议看到类似的程序看看JDK的源代码,我觉得,这时看源代码反而比看帮助文档来得更直接了当,也更容易明白个中源由。
- 初学JAVA易错点1
- Java初学1
- 初学java小结1
- JAVA初学笔记1
- java初学1
- JAVA初学(1)
- 初学java随笔(1)
- java-反射初学(1)
- java枚举:初学(1)
- Java初学
- 初学JAVA
- 初学Java
- Java初学
- 初学JAVA
- Java初学
- 初学java
- 初学java
- 初学java
- 我对C++ string和length方法的一个长期误解------从protobuf序列化说起(没处理好会引起数据丢失、反序列化失败哦!)
- 【Android】14、SimpleAdapter
- **1051 - My-graph-同构图
- javaPOI导出excel代码
- Collection和Map
- 初学JAVA易错点1
- ViewPager+Fragment取消预加载(延迟加载)
- Spring之DataSource配置
- HDU 5952 - Counting Cliques
- 欢迎使用CSDN-markdown编辑器
- Fragment 的懒加载
- 俞可平:党连一顿饭吃几个菜都管,可为什么还有人贪污?
- 在页面中使用分页查询
- NOIP提高组历年试题狂做