其实在读大学的时候就有在读thinking in java 了,不过那时并没有读完,而且也只是浏览一遍,更别说什么做笔记啥的,所以现在有很多java 的基础也记不牢了,刚好趁着这段时间又再重新读一遍,顺便随手做一下笔记。
1 一般来说,java对象的引用是放在堆栈上的,java对象是存储在堆上,但基本类型的数据是特殊的,为了更加高效,所以不用new来创建变量,而是创建一个非引用的自动变量,并将它直接存储在堆栈上。
2 ==和!=比较的是对象 的引用,不要跟equal()方法混淆了。
3 equals()的默认行为是比较引用,所以如果要在新创建的类上比较内容的话,需要自己重写覆盖。
4 java的编译器通常会将指数作为双精度数来处理,所以 float f=1e-43f; 后面一定要加个f。
5 对于布尔值,按位操作符具有跟逻辑运算符一样的功能,只是不会“短路”,只能操作整数类型的数据
6 移位操作符只对整数类型有效,对于char、short、byte在进行移位之前会转成int类型,操作结果也是int 类型
7 java不允许将一个数字作为布尔值来处理,所以if(0)之类的都是编译错误的
8 对于for循环,如果使用break 中断循环,递增表达式不会执行
9 方法中,如果传入的数据类型小于方法中的声明的参数类型,实际数据类型会被提升,如byte-->short--->int--->long 但char会直接转成int;但如果传入的数据类型大于声明的参数类型,要进行窄化转换不然会报错
10 实例化一个类时,是无法阻止自动初始化的进行的(比如说int类型的的默认值是0),它是在构造器被调用之前发生的
11 java 会默认自动在子类的构造器总插入对父类默认的无参构造器的调用,即使你没有显示写super()
12 非static 的代码块的执行是先于构造器的
13 在多态的环境中,任何域的访问操作都是有编译器解析,所以不是多态的,也就是说比如父类parent 有name属性,子类children也有自己定义的name属性,parent p=new children();p.name得到实际是父类name属性,而不是子类的,而p.getname()则可以得到子类name,因为普通方法的调用都是多态,除了static
14 在继承关系中,子类的实例化的顺序:先调用父类的构造器,然后才是子类中按声明顺序调用成员的初始化,最后才是子类构造器主体
15 对于类,继承只能单继承,而对于接口,是可以多继承的
16 内部类拥有其外部类的所有元素的访问权
17 如果内部类需要生成对外部类对象 的引用,可以用外部类的名字后面紧跟圆点和this;当想要直接创建内部类的对象要先实例化外部类对象,然后用外部类对象去new,而不是用外部类的名字去实例化
18 如果定义了一个匿名的内部类,且希望它使用一个在其外部定义的对象,那么编译器要求这个对象引用是由final修饰的;还有匿名内部类里面是不允许有构造器的
19 嵌套类,说到底就是一个加上static修饰的内部类,嵌套类的对象是不能够访问非静态的外围类对象的
20 在调用Arrays.asList()方法要注意
21 ListIterator是Iterator的子类型,它只能用于list类的访问,它与iterator 的区别在于它可以双向移动并且可以在一个开始就指定从哪个索引开始迭代
22 foreach 能循环数组和collection,之所以能遍历是因为引入了iterable接口,这个接口包含了一个能够产生interator的方法,并且这个接口被foreach用来在序列中移动,所以只要自定义的类都实现了iterable这个接口,都可以被foreach循环
23 在继承关系中,覆盖方法的时候,只能抛出在基类方法的异常说明中列出的那些异常,不过这个限制对构造器不起作用
24