[Java]初学笔记(持续更新)

<Thinking in Java>读书笔记

 

this

  关于关键字this,除了用于在类中消歧之外,还可以在构造函数中调用其他构造函数

    this(参数们); //这里表示调用该类中对应的构造函数。

  有2点需要注意:

  (1)这种调用必须是构造函数中的第一个语句

  (2)通过这种方式一次只能调用一次构造函数(因为(1))

  例如:

public class Person
{
    private int age;
    private String name;

    Person(int p_age, String p_name)//构造方法1
    {
        this.age = p_age;
        this.name = p_name;
    }

    Person(int p_age)//构造方法2
    {
        this(p_age,"Unknown");//调用构造方法1
    }

    public static void main(String[] args)
    {
        Person p = new Person(99);
    }
}

  

 

Java 和 C#的区别:

在Java中

1.所有的方法默认为virtual;

2.所有数值类型都是有符号(signed)类型,不存在无符号(unsigned)类型;  p23

3.没有sizeof();  p56

4.switch中的case只能和int, char 和 enum匹配;  p74

5.switch中的case可以不写break而进行互相穿透;

6.当类的字段(field)是基本类型时,可以不被显示初始化,会被赋予默认值;  p92

 

//目前看到page:108

 

重要的区别!

(0)字符串比较,==居然比的是引用地址!!! 需要比较实际字符集是否相等需要调用equals()方法

(1)没有神器get/set!!!只能通过手共设置普通方法来完成对应操作

 

(2)List之类的东西不支持[]式的快速访问,只能分别通过list.get(index)/list.set(index)来获取/设置值

 

(3)二维数组不支持[][]方式访问...我无力了...

 

(4)没有decimal,不过有一个java.math.BigDecimal,不过这个东西用起来要很小心,很容易犯错误。

 

(5)最绝的,没有以2为底的log函数,提供的java.math.log()方法是以e为底数的!!!一定要小心,如果需要计算log_2需要自己换底。(我忍不住要吐槽一下,这玩意儿这真的是为程序员设计的麽???)

 

(6)Map之类容器的contains()方法内置陷阱,非常容易引人犯错。

默认的contains(Object obj),就算你设置了泛型这个方法接受的参数也是一样的。

例如我有Map<Integer,String> mapKV;

当我需要确认我的Map中是否存在Key:1的记录时

调用mapKV.containsKey(1);和mapKV.containsKey("1");产生的结果是完全不一样的,此错误非常隐蔽,从C#转来的我在这里被卡了很久很久。所以别看containsKey(...)接受的是Object参数,你一定需要手动将传入的参数手动转换成和key匹配的类型传入才行!!!

我就觉得很奇怪了,Integer.Parse((object)1)和Integer.Parse((object)“1”)产生的结果明明是一样的,最后却出现这种结果,实在是不能理解啊!!!

实例如下:

          int i = 1;
		Object oi = 1;
		String s = "1";
		Object os = "1";
		
		System.out.println(Integer.parseInt(oi.toString()));
		System.out.println(Integer.parseInt(s.toString()));		
		
		Map<Integer, String> m = new HashMap<Integer, String>();
		m.put(1, "damn you java");

		if(m.containsKey(i))
		{
			System.out.println("String i = 1 - OK");	
		}
		else
		{
			System.out.println("Object i = 1 - Fail");
		}
		
		if(m.containsKey(oi))
		{
			System.out.println("Object oi = 1 - OK");	
		}
		else
		{
			System.out.println("Object oi = 1 - Fail");
		}
		
		if(m.containsKey(os))
		{
			System.out.println("Object os = 1 - OK");	
		}
		else
		{
			System.out.println("Object os = 1 - Fail");
		}
		
		
		if(m.containsKey(s))
		{
			System.out.println("String s = '1' - OK");	
		}
		else
		{
			System.out.println("Object os = '1' - Fail");
		}
		

 

输出:

1
1
String i = 1 - OK
Object oi = 1 - OK
Object os = 1 - Fail
Object os = '1' - Fail

 

 

... ... to be continued

posted @ 2012-05-01 21:43  叫我学徒  阅读(209)  评论(0)    收藏  举报