第一章 operators\controlling execution
- import static 关键字是直接导入某个类的所有变量和方法到本类,这样就可以直接在当前类中引用导入类的变量和方法
- 几乎所有的operator都只作用在原始数据类型上(primitives), 特别的, “=”, “==”, ”!=“作用在所有object上
额外的,String类支持”+=", “+” - Java数据类型分为原始数据类型和对象数据类型,原始类型如int、boolean、double,
对象类型即为Java类的实例。如果将一个原始类型赋值给另一个变量,则会复制一份,各自修改值互不干涉。如果将对象类型赋值给另一个变量,则只是赋给它对象的引用(也就是指针),修改该对象的值两者都会修改 - == 比较两个对象是否同一个引用。而equals比较两个对象的值是否相同。
- 指数表示法:使用e或者E跟随一个整数值表示幂指数,如果是负值,则需要跟f或d表示小数。
- 如果为整数则跟L表示long,不跟则表示为int
float expFloat = 1.39e-43f
double expDouble = 47e47d // d is optional
double expDouble2 = 47e47 - unsigned right shift >>>, shift同时能和 = 结合, 成为>>>= >>= or <<= <<<=
8. swtich(c) 条件必须是int 或者char 类型,否则会编译错误(Java SE5)
第二章 Initialization & Cleanup
- Java与C的最大区别就是Java的销毁是自动的,由GC完成。
- 构造函数是一种特殊的method,因为其没有返回值
void类的函数可以return nothing 也可以选择返回 something else. - override、overload、overwrite:
override(覆盖): 当子类从父类继承一个无参方法,而又定义了一个同名同参数列表(返回类型)的方法时,称为覆盖
overload(重载):继承了父类的某个函数,同时建立了一个同名的但参数列表不同的方法,则称为重载(待修)
overwrite(重写):当前类的方法,有许多同名,但是参数列表不同(顺序也算) - 在Java中只能根据参数类型来区分同名函数,试想下面的例子:
void f(){}
int f(){}
当你调用f()时,Java将难以分辨你调用了何种,因此,你不能使用return value来区分重载(*)方法。 - 非静态方法中默认隐含this以寻找对象,静态方法不含有this。
- 除了this.method(…)和super.method(…)的用法外,还能用this(…)来引用当前类的构造方法和super(…)来引用父类的构造方法。
- static method表示这个method里不含有this,所以不能在static method里调用non-static method。
And putting the static method inside a class allows it access to other static methods and to static fields. - GC只能释放new出来对象的memory, 而不能释放一些特殊申请的空间(比如用native methods?)
- 并不是所有的Java类都需要提供finalize()方法,只有在该类被销毁时,同时需要释放该类所拥有的一些资源时才需要添加,例如:
public void MyClass{
Connection conn;
public finalize(){
conn.close()
}
}
- if the JVM isn’t close to running out of memory, it might not waste time recovering memory through garbage collection.
- finalize()可以用来检验一些条件,可以帮助检查一些bug是否发生,例如:
protected void finalize(){
if(checkedOut){
System.out.println("Something wrong here!");
}
}
- 引用计数是垃圾回收的一种算法,建立一个全局计数器,记录每个对象的引用次数,如果为0则表示可以被回收。
- 回收时额外建立一份heap, 将需要继续使用的内存复制上去(基于chunk, big block),再将所有引用修正。
- 标记删除算法是垃圾回收的另一种算法,对于已经回收的对象标记它已经被删除了,下次需要的时候会先使用这些空间,这样避免了垃圾回收时内存对象移动带来的开销。
- JIT just-in-time compiler
- static first then non-static
- 可变变量 如果某一个参数后面跟一个省略号,则表示可以是任意个数的同类型变量。
- 如果有很多同名的函数,然而参数都只有可变数组类型,在可变数组为0个时,会导致编译器不知道决定使用哪一个函数。
- In fact, enums are classes and have their own methods.
第三章 Access Control
- 一个工作程序是一捆能被打包压缩进JAR文件的.class文件。JAVA解释器负责对这些文件的寻找,加载,解释。
- 包的名称由"."分割,第一个通常是报的组织名,如com、org、net等;第二个通常是公司名;第三、四个单词通常会使范围逐渐缩小。
- 编译后的Java类是按照包名为路径存储的,因此,命名空间有两个好处,一个是指定类的寻址方式,一个是指定类的存储方式。
- JAVA并不会总是访问当前路劲作为搜寻的起点。如果你不在CLASS PATH里将’.'作为其中一条path, Java并不会访问当前路径。
- 如果.java文件没有注上包名,都会被统一分配到"default package"下。所有在同package下的文件可以互相access, 所以"default package"下的文件有互相access的能力。
- private不能修饰类,只能修饰变量和方法。并且由private修饰的变量或方法,只能被该类自身所访问和修改,而不能被任何其他类(包括子类)来获取和引用。–最高级别保护
- 有时候你可能会想要控制一个对象的创建方式,并且防止别人直接接触一个特殊的构造函数,可以参考下面的例子实现:
class Sundae{
private Sundae(){}
static Sundae makeASundae(){
return new Sundae();
}
}
public class IceCream {
public static void main(String[] args){
//! Sundae x = new Sundae();
Sundae x = Sundae.makeASundae;
}
}
-
protected修饰的成员变量可以被其他3种类所引用:该类自身、与它在同一个包中的其它类、在其他包中的该类的子类。
使用protected修饰符的主要作用是允许其他包中该类的子类访问父类的特定属性。 -
不带修饰符的方法仅对同一个包中的任意类可见。
-
由于你不能用private修饰类,所以对类的访问控制只有两种选择:package access 和 public.
-
如果你不想让任何人接触某一个类,你可以使其所有构造函数都private。