黑马程序员技术交流社区

标题: 我的易错总结 [打印本页]

作者: coqns    时间: 2012-12-11 19:48
标题: 我的易错总结
本帖最后由 coqns 于 2012-12-11 19:50 编辑

学习java基础视频已经有一段时间了,自己总结了一些容易犯错以及疏忽的地方
一、构造方法
1.未显式定义构造方法时,系统会自动定义无参构造方法。
2.显式定义有参构造方法后,系统就不会再自动定义无参构造方法,所以如果这个时候再想Peron p=new Person();的话,自己就必须再显式定义无参构造方法。

二、“==”和“equals”
1.==是判断两个变量或实例是不是指向同一个内存空间(比较引用)。
2.equals是判断两个变量或实例所指向的内存空间里的值是不是相同(比较内容)。
  1. public class CompareDemo
  2. {
  3.      public static void main(String[] args)
  4.      {
  5.          String s1=new String("123");
  6.          String s2=new String("123");
  7.          
  8.          //这个时候s3和s1无论是指向的内存地址还是地址里面的值都完全相等
  9.          String s3=s1;
  10.          
  11.          //输出结果为false,说明==比较的是指向的内存地址
  12.          System.out.println(s1==s2);
  13.          //输出结果为true,说明equals比较的是值
  14.          if (s1.equals(s2))
  15.              System.out.println("true");
  16.          else
  17.              System.out.println("false");
  18.      }
  19. }
复制代码
三、栈内存和堆内存
  1. class Demo
  2. {
  3.     public static void main(String[] args)
  4.     {
  5.         int[] arr1=new int[]{1,2,3};
  6.         int[] arr2=arr1;
  7.         arr2[0]=10;
  8.         System.out.println(arr1[0]);
  9.     }
  10. }
复制代码
如上面这段代码,arr1[0]初始化的时候值是‘1’,也并没在在代码里见更改它的值,但最后输出的时候却是‘10’。这是因为arr2没有new,而是指向arr1的,所

以arr2不是在堆内存里又新开辟了一个空间,而是和arr1共享了。所以改了arr2[0]的值,arr1[0]的值也就改了。

四、成员变量和静态(类)成员变量
1.静态成员变量是随着类的初始化开始随着类的结束而结束的。在这期间它一直在方法区中存在。
2.成员变量则是用到了的时候才会在堆内存中创建。
所以静态方法中不能调用普通成员变量。

五、日期格式化
比如下面这段代码,我现在运行后结果是:(当前日期是:2012-59-26)
月份会不正常,面当把"yyyy-mm-dd"改成"yyyy-MM-dd"后就会正常。所以MM大写是严格的,不能因为旁边y和d是小写面疏忽
另外Date类现在已经被标为过时,应该用Calendar类了,这个是Java对日期的最新支持的类,用这个获取时间就不会出错的
  1. import java.util.Date;
  2. import java.text.SimpleDateFormat;

  3. class Demo
  4. {
  5.     public static void main(String[] args)
  6.     {
  7.         Date date=new Date();
  8.         SimpleDateFormat sdf=new SimpleDateFormat("yyyy-mm-dd");
  9.         String result=sdf.format(date);
  10.         System.out.println("当前日期是:"+result);
  11.     }
  12. }
复制代码
六、int和Integer
首先,int是基本类型而Integer则是引用类型,Integer是int的封装类。下面则是区别
1.int的默认值为0,它无法表达出未赋值的情况。
2.Integer的默认值为null,它可以表达出未赋值的情况(null),且自带有很多方法,比如类型转换。
比如说要区分出未参加考试和参加考试但考了0分,int就做不到,而Integer可以。


作者: 林志花    时间: 2012-12-12 20:57
好好总结,天天向上,好样的!
作者: coqns    时间: 2012-12-13 00:25
林志花 发表于 2012-12-12 20:57
好好总结,天天向上,好样的!

一起加油,共同进步~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2