本人之前一直从事iOS开发,最近开始接触Eclipse插件开发,打算先重拾一下扔了很久的Java。看到大家都在网上推荐李刚的《疯狂JAVA讲义》,于是下了一本开始学习。以下为前七章本人记录的一些要点和体会:
Java概述
1.一个Java源文件可以包含多个类定义,但最多只能包含一个public类定义;如果Java源文件里包含public类定义,则该源文件的类名必须与这个public类的类名相同。
2.可以通过调用对象的finalize()方法或System.gc()等方法来建议系统进行垃圾回收;对于不再使用的对象,不要再引用它们,通过将引用变量设置为null
数据类型和运算符
3.使用巨大的整数常量(超出int范围)时,应在常量后增加l或L作为后缀
流程控制和数组
4.定义数组时不能指定数组长度
5.Java二维数组的实质还是一维数组,数组元素里保存的引用指向一维数组
面向对象(上)
6.Java里方法的参数传递方式只有一种,将实际参数值的副本传入方法中
7.长度可变的形参只能处于形参列表的最后。一个方法中最多只能包括一个长度可变的形参。调用包含一个可变长度形参的方法时,这个长度可变的形参既可以传入多个参数,也可以传入一个数组。
8.Java支持方法重载,要求同一个类中方法名相同,参数列表不同。治愈方法的其他部分,如方法返回值类型、修饰符等,与方法重载没有任何关系
9.成员变量位于堆内存,无须显示初始化,局部变量除了形参之外,位于栈内存,都需要显示初始化。栈内存中的变量无须系统垃圾回收,栈内存中的变量往往是随方法或代码块运行完成而结束。
10.
访问控制级别表
|
private
|
default
|
protected
|
public
|
同一个类中
|
√
|
√
|
√
|
√
|
同一个包中
|
|
√
|
√
|
√
|
子类中
|
|
|
√
|
√
|
全局范围内
|
|
|
|
√
|
11.不管是否使用super调用来执行父类构造器的初始化代码,子类构造器总会调用父类的构造器一次
12.可以声明不同类型,但变量名相同的实例变量来覆盖父类的实例变量
13.通过引用变量来访问其所包含的实例时,系统总是试图访问它编译时类所定义的属性,而不是它运行时类所定义的属性
14.继承带来了高度复用的同时,也严重地破坏了父类的封装性。在继承关系中,子类可以直接访问父类的属性和方法,从而造成子类和父类的严重耦合
初始化块
15.初始化块是Java类里可出现的第四种成员(前面依次有属性、方法和构造器),一个类里可以有多个初始化块,相同类型的初始化块之间按定义的先后顺序执行。初始化块只在创建Java对象时隐式执行,而且在执行构造器之前执行
16.普通初始化块、声明实例属性指定的默认值都可认为是对象的初始化代码,它们的执行顺序与源程序中排列顺序相同
17.当Java创建一个对象时,系统先为该对象的所有实例属性分配内存(前提是该类已经被加载过了),接着程序开始对这些实例属性执行初始化,其初始化顺序是:先执行初始化块或声明属性时指定的初始值,再执行构造器里指定的初始值
18.如果有一段初始化代码对所有对象完全相同,且无须接受任何参数,就可以把这段初始化处理代码提取到初始化块中
19.创建一个Java对象时,系统会先执行父类的初始化块和构造器,再执行该类的普通初始化块和构造器
20.静态初始化块是类相关的,系统将在类初始化阶段执行静态初始化块,而不是在创建对象时才执行。只有当类初始化完成之后,才可以在系统中使用这个类,包括访问这个类的类方法、类属性,或者用这个类来创建实例
面向对象(下)
21.JDK提供了自动拆箱和自动装箱,大大简化了基本类型变量和包装类对象之间的转换过程。
22.null对象可以访问它所属类的成员
23.单例模式需要将构造器声明为private,同时提供一个public方法作为访问点
24.final修饰变量时,表示该变量一旦获得了初始值之后就不可能被改变
25.final修饰成员变量,如果既没有在定义成员变量时指定初始值,也没有在初始化块、构造器中为成员变量指定初始值,那么这些成员变量的值将一直是0、'\u0000'、false或null
26.final修饰方法不可被重写(可以被重载),如果出于某些原因,不希望子类重写父类的某个方法,则可以使用final修饰该方法
27.对于一个private方法,因为它仅在当前类中可见,其子类无法访问该方法,所以子类无法重写该方法——如果子类中定义一个与父类private方法有相同方法名、相同形参列表、相同返回值类型的方法,也不是方法重写,只是重新定义了一个新方法。因此,即使使用final修饰一个private访问权限的方法,依然可以在其子类中定义与该方法具有相同方法名、相同形参列表、相同返回值类型的方法。
28.final修饰的类不可有子类
29.当abstract修饰类时,表明这个类只能被继承,当abstract修饰方法时,表明这个方法必须由子类提供实现。而final修饰的类不能被继承,final修饰的方法不能被重写。因此final和abstract永远不能同时使用。
30.abstract不能用于修饰属性,不能用于修饰局部变量;也不能用于修饰构造器
31.abstract不能和static、private同时使用
32.接口定义的是多个类共同的公共行为规范,因此接口里所有成员都是public访问权限
33.在接口中定义属性时,不管是否使用public、static和final修饰符,接口里的属性总将使用这三个修饰符来修饰。而且,接口里没有构造器和初始化块,因此接口里定义的属性只能在定义时指定默认值。
34.接口里的方法总是使用public abstract来修饰
35.实现接口方法时,必须使用public访问控制修饰符
36.内部类作用:1.内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类;2.内部类成员可以直接访问外部类的私有数据;3.匿名内部类适合用于创建那些仅需要一次使用的类
37.如果外部类属性、内部类属性与内部类里方法的局部变量同名,则可通过使用this、外部类类名.this作为限定来区分
38.非静态内部类里不能有静态方法、静态属性、静态初始化块
39.Java允许在接口里定义静态内部类和内部接口
40.内部类如果使用private来修饰只能在外部类内部使用,使用public可以在任何地方访问
41.非静态内部类的构造器必须使用外部类对象来调用
42.局部内部类在方法中定义,仅在该方法里有效,无需使用访问控制符和static修饰符
43.匿名内部类适合创建那种只需要使用一次的类,创建匿名内部类时系统会立即创建一个该类的实例,这个类定义立即消失,不能重复使用。
44.匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或实现一个接口
45.匿名内部类不能是抽象类;不能定义构造器
46.如果匿名内部类需要访问外部类的局部变量,则必须使用final修饰符来修饰外部类的局部变量