1.比较对象和基本类型 ==和!= 比较的是对象的引用。equals()比较的是对象的内容。 基本类型可以直接用==和!=比较 如果在自己写的类中。必须覆盖equals() 因为equals()默认比较的是引用 大多数的java类库都实现了equals()方法,以便用来比较对象的内容,而非比较的引用。
2. 标签,break,continue
demo: label1: outer-iteration{ inner-iteration{ break; // (1) continue; //(2) continue label1;(3) break label1;(4) } }
在(1)中,break中断内部迭代,回到外部迭代。在(2)中,continue使执行点移回内部迭代的起始处。 在(3)中,continue label1 同时中断内部迭代以及外部迭代,直接转到label1处,继续从外部迭代继续迭代过程。 在(4)中,break label1 中断所有迭代,并回到label1处但并不重新进入迭代,完全中止了两个迭代。
3.对象创建过程 1)首次创建对象时,或者类的静态方法/静态域首次被访问时,java解释器必须炒作类路径,定位类.class文件。(构造器可以看成静态方法) 2)然后载入类.class文件,有关静态初始化的所有动作都会执行,因此,静态初始化只在class对象首次加载的时候进行一次。 3)当用new 类()创建对象的时候,首先将在堆上为类对象分配足够的存储空间。 4)这块存储空间会被清零,这就自动地将类对象中的所有基本类型数据都设置成了默认值,而引用则被设置成为null. 5)执行所有出现于字段定义初的初始化动作 6)执行构造器
4.构造器的调用顺序 基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用。 1)调用基类构造器。这个步骤会不断地反复递归下去,首先是构造这种层次结构的根,然后是下一层导出类,等等,知道最底层的导出类。 2)按声明顺序调用成员的初始化方法。 3)调用导出类构造器的主体。
5.编写构造器的准则 用尽可能简单的方法使对象进入正常状态;如果可以的话,避免调用其他方法。(在构造器内唯一能够安全调用的那些方法是基类中的final方法,也适用于private方法,这些方法不能被覆盖。因此是安全的。)
6.内部类 可以将一个类的定义放在另一个类的定义内部,这就是内部类。 内部类的作用: 1)隐藏名字和组织代码 2)当生成一个内部类的对象时,此对象与制造它的外围对象之间就有了一种联系,所以它能访问其外围对象的所有成员,而不需要任何特殊条件。此外,内部类还拥有其外围类的所有元素的访问权。 内部类如何做到自动拥有对其外围类所有成员的访问权: 当某个外围类的对象创建了一个内部类对象时,此内部类对象必定会秘密地捕获一个指向那个外围类对象的引用。然后,在你访问此外围类的成员时,就是用那个引用来选择外围类的成员。编译器会帮你处理所有的细节。
使用.this与.new 如果你需要生成对外部类对象的引用,可以使用外部类的名字后面紧跟圆点和this.这样产生的引用自动地具有正确的类型。 有时你可能想要告知某些其他对象,去创建其某个内部类的对象。要实现此目的,你必须在new表达式中提供对其他外部类对象的引用,这时需要.new .
7.嵌套类: 如果不需要内部类对象与其外围类对象之间有联系,那么可以将内部类声明为static.这通常称为嵌套类。 普通的内部类对象隐式地保存了一个引用,指向创建它的外围类对象。然而,当内部类是static时,就不这样了。 嵌套类意味着: 1)要创建嵌套类的对象,并不需要其外围类的对象。 2)不能从嵌套类的对象中访问非静态的外围类对象。 嵌套类与普通的内部类还有一个区别。普通内部类的字段与方法,只能放在类的外部层次上,所以普通内部类不能有static数据和static字段,也不能包含嵌套类。但是嵌套类可以包含所有这些东西。 内部类的特性: 1)内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。 2)在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或基础层同一个类。 3)创建内部类对象的时刻并不依赖于外围类对象的创建。 4)内部类并没有令人迷惑的is-a 关系,它就是一个独立的实体。
8.数组 无论使用哪种类型的数组,数组标识符其实只是一个引用,指向在堆中创建的一个真实对象,这个(数组)对象用以保存指向其他对象的引用。 对象数组和基本类型数组在使用上几乎是相同的;唯一的区别就是对象数组保存的是引用,基本类型数组直接保存基本类型的值。
9.枚举类型 关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用。 switch语句中的enum. enumMap是一种特殊的map,它要求其中的键(key)必须来自一个enum.由于enum本身的限制,所以enumMap在内部可由数组实现。因此enumMap的速度很快,我们可以放心地使用enum实例在enumMap中进行查找操作。不过,我们只呢将enum实例作为键来调用put()方法,其他操作与使用一般m ap差不多。
10.注解 注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化方法,使我们可以在稍后某个时刻非常方便地使用这些数据。 @Override:表示当前的方法定义将覆盖超类中的方法。拼写错误和方法对不上,编译器会发出错误提示。 @Deprecated: 如果程序员使用了注解为它的元素,编译器会发出警告信息。 @SuppressWarinings: 关闭不当的编译警告信息。
|