八.多态
1.java中除了static和final方法(private方法属于final方法)之外,其他所有的方法 都是后期绑定,这意味着通常情况下,我们不必判定是否应该进行后期绑定-它会自动发生。
2.在覆盖类型中,向上转型可以这样描述:Shape s = new Circle(),shape为基类,circle为派生类。
3.向上转型是在return语句里发生的(返回什么值相应的就是什么类型)
4.在编译时,编译器不需要获得任何的特殊信息就能进行特殊的调用。
5.如果某个方法是静态的,它的行为就不具有多态性,静态方法是与类,而并非与单个的对象相关联。
6.复杂对象调用构造器要遵循下面的顺序:1)调用基类构造器,递归上去然后从上向下执行。 2)按照声明顺序调用成员的初始化方法。 3)调用导出类构造器的主体。
7. 对于基类(遵循c++中析构函数的形式),应该首先对其导出类进行清理,然后才是基类。这是因为导出类的清理可能会调用基类中的某些方法,所以需要使基类中的构件仍起作用而不是过早的销毁它们。
8.在java中long定义和int定义不同,使用long可以防止溢出。
九.接口
1.接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。
2.抽象类是普通的类与接口之间的一种中庸之道
3.abstract void f(),包含抽象方法的类叫做抽象类,如果一个类包含一个或者是多个抽象方法的时候,该类必须被限定为抽象的。
4.创建抽象类和抽象方法非常有用,因为它们可以使类得抽象性明确起来,并告诉用户和编译器打算怎样来使用它们。抽象类还是很有用的重构工具,因为它们使得我们可以很容易的将公共方法沿着继承层次结构向上移动。
5.interface不仅仅是一个极度抽象的类,因为它允许人们通过创建一个能够被向上转型为多种基类的类型,来实现某种类似多重继承变种的特性。要想创建一个接口,需要用interface关键字来代替class关键字,就像类一样,可以在interface前面添加public关键字
6.使用接口的核心原因:为了能够向上转型为多个基类型;防止客户端程序员创建该类的对象。
7.如果知道某事物应该成为一个基类,那么第一选择应该是使它成为一个接口
8.接口最吸引人的原因之一就是允许同一个接口具有多个不用的具体实现。
9.放入接口中的任何域都自动是static和final的,所以接口就成为了一种很便捷的用来创建向量组的工具。
10.java中标识具有常量初始化值得static final时,会使用大写字母的风格。
十.内部类
1.可以将一个类的定义放在另一个类的定义内部,这就是内部类。
2.内部类能访问其外围对象的所有成员,而不需要任何的特殊条件(此外,内部类还拥有其外围类的所有元素的访问权)
3.构建一个内部类对象的时候,需要一个指向其外围类对象的引用。
4.匿名内部类与正规的继承相比有些受限,因为匿名内部类既可以实现扩展类,也可以实现接口,但是不能两者兼备,而且如果是实现接口,也只能实现一个接口。
5.使用内部类最吸引人的地方是:每个内部类都能独立的继承自一般接口的实现,所以无论外围类是否已经继承了某个接口的实现,对于内部类都没有影响。
6.如果内部类是匿名的,编译器会简单的产生一个数字作为其标识符。如果内部类是嵌套在别的内部类之中,只需直接将他们的名字加载器外围类标识符与“$”的后面。
十一.持有对象
1.collection在每个槽内只能保存一个元素。此类容器包括:List,他以特定的顺序保存一组元素;set元素不能重复;queue,只允许在容器的一端插入对象,并从另一端移除对象.Map在每个槽内保存了两个对象,即键和与之相关联的值。
2.在collection中打印出来的内容可以用方括号括住,每个元素由逗号分隔。Map则用大括号括住,键与值由等号联系(键在等号左边,值在右边)。
3.toArray()方法将任意的Collection转化为一个数组。这是一个重载方法,其无参数版本返回的是Object数组,但是如果你向这个重载版本传递目标类型的数据,那么它将产生指定类型的数据(假设它能通过类型检查)。如果参数数组太小,存放不下list中的所有元素,toArray方法将创建一个具有合适尺寸的数组。
4.接受对象容器并传递它,从而在每个对象上都执行操作,这种思想十分强大,并且贯穿整本书。
5.迭代器统一了对容器的访问方式(能够将遍历序列的操作与序列底层的结构分离)。
6.set不保存重复的元素。
十二.通过异常处理错误
1.java的基本理念是“结构不佳的代码不能运行”
2.Java使用异常来处理已知的错误报告模型,使得构件能够与客户端代码可靠的沟通问题。
3.异常处理程序的任务是:将程序从错误状态中恢复,以使程序能要么换一种方式运行,要么继续运行下去。
4. 在异常处理程序调用了Throwable类声明的printStackTrace()方法,它将打印“从方法调用处直到异常抛出处”的方法调用序列,信息被自动捕获和显示在输出中。
5.Throwable这个java类被用来表示任何可以作为异常抛出的类
6.无论异常是否被抛出,finally子句总能被执行。
7.当要把除了内存之外的资源恢复到它们的状态的时候,就要用到finally子句,这种需要清理的资源包括:已经打开的文件或者是网络连接,在屏幕上画的图形,甚至可以是外部世界的某个开关。
8.有两种可以获得Throwable对象的方法:在catch子句中使用参数或者用new操作符创建。
9.特别注意下面这一行:throw new NullPointerException("demo");
这里,new用来构造一个NullPointerException实例。所有的Java内置的运行时异常有两个构造函数:一个没有参数,一个带有一个字符串参数。当用到第二种形式时,参数指定描述异常的字符串。如果对象用作 print( )或println( )的参数时,该字符串被显示。这同样可以通过调用getMessage( )来实现,getMessage( )是由Throwable定义的。
十三.字符串
1.当你创建一个Formatter对象的时候,需要向其构造器传递一些信息,告诉它最终的结果将向哪里输出
2.在将precision应用于String时,它表示打印String时输出字符的最大数量。而在将precision应用于浮点数的时候,它表示小数部分要显示出来的位数,如果小数位数过多则舍入,太少则在尾部补零。由于整数没有小数部分,所以precision无法应用于整数,如果你对整数应用precision,则会触发异常。
3.将%b应用于非布尔类型的对象请格外小心,因为在对于其他的类型中值不为null的情况下转化结果为true
4.如果想表示一位数字,那么正则表达式应该是\\d。如果你想插入一个普通的反斜线,应该为\\\\,不过换行和制表符之类的东西只需要使用单反斜线:\n\t
5.在java中,\\的意思是“我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义”,转义后使之成为一个普通字符
6.判断一个句子是否以大写字母开头,使用“^[A-Z].*[\\.]$”
7.将a和b分割开的语句是“split("a|b")
8.量词描述了一个模式吸收输入文本的方式:贪婪型,勉强型,占有型
十四.类型信息
1.在产生类的对象的时候运行这个程序的java虚拟机将使用被称为“类加载器”的子系统
2.类加载器子系统实际上可以包含一条类加载器链,但是只有一个原生类加载器,它是JVM实现的一部分,原生类加载器加载的是所谓的可信类,包括java api类,它们通常是从本地盘加载的。
3.所有的类都是在使用的时候动态加载到jvm中的
4.在为类准备的时候实际上包含三个步骤:加载,链接,初始化
5.如果一个static域不是final的,那么在对它访问的时候,总是要求在他被读取之前,要此案进行链接和初始化。
6.interface关键字的一种重要目标就是允许程序员隔离构件,从而降低耦合性
7.面向对象编程语言的目的是让我们在凡是可以使用的地方都使用多态,而只在必需的时候使用rtti
1.java中除了static和final方法(private方法属于final方法)之外,其他所有的方法 都是后期绑定,这意味着通常情况下,我们不必判定是否应该进行后期绑定-它会自动发生。
2.在覆盖类型中,向上转型可以这样描述:Shape s = new Circle(),shape为基类,circle为派生类。
3.向上转型是在return语句里发生的(返回什么值相应的就是什么类型)
4.在编译时,编译器不需要获得任何的特殊信息就能进行特殊的调用。
5.如果某个方法是静态的,它的行为就不具有多态性,静态方法是与类,而并非与单个的对象相关联。
6.复杂对象调用构造器要遵循下面的顺序:1)调用基类构造器,递归上去然后从上向下执行。 2)按照声明顺序调用成员的初始化方法。 3)调用导出类构造器的主体。
7. 对于基类(遵循c++中析构函数的形式),应该首先对其导出类进行清理,然后才是基类。这是因为导出类的清理可能会调用基类中的某些方法,所以需要使基类中的构件仍起作用而不是过早的销毁它们。
8.在java中long定义和int定义不同,使用long可以防止溢出。
九.接口
1.接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。
2.抽象类是普通的类与接口之间的一种中庸之道
3.abstract void f(),包含抽象方法的类叫做抽象类,如果一个类包含一个或者是多个抽象方法的时候,该类必须被限定为抽象的。
4.创建抽象类和抽象方法非常有用,因为它们可以使类得抽象性明确起来,并告诉用户和编译器打算怎样来使用它们。抽象类还是很有用的重构工具,因为它们使得我们可以很容易的将公共方法沿着继承层次结构向上移动。
5.interface不仅仅是一个极度抽象的类,因为它允许人们通过创建一个能够被向上转型为多种基类的类型,来实现某种类似多重继承变种的特性。要想创建一个接口,需要用interface关键字来代替class关键字,就像类一样,可以在interface前面添加public关键字
6.使用接口的核心原因:为了能够向上转型为多个基类型;防止客户端程序员创建该类的对象。
7.如果知道某事物应该成为一个基类,那么第一选择应该是使它成为一个接口
8.接口最吸引人的原因之一就是允许同一个接口具有多个不用的具体实现。
9.放入接口中的任何域都自动是static和final的,所以接口就成为了一种很便捷的用来创建向量组的工具。
10.java中标识具有常量初始化值得static final时,会使用大写字母的风格。
十.内部类
1.可以将一个类的定义放在另一个类的定义内部,这就是内部类。
2.内部类能访问其外围对象的所有成员,而不需要任何的特殊条件(此外,内部类还拥有其外围类的所有元素的访问权)
3.构建一个内部类对象的时候,需要一个指向其外围类对象的引用。
4.匿名内部类与正规的继承相比有些受限,因为匿名内部类既可以实现扩展类,也可以实现接口,但是不能两者兼备,而且如果是实现接口,也只能实现一个接口。
5.使用内部类最吸引人的地方是:每个内部类都能独立的继承自一般接口的实现,所以无论外围类是否已经继承了某个接口的实现,对于内部类都没有影响。
6.如果内部类是匿名的,编译器会简单的产生一个数字作为其标识符。如果内部类是嵌套在别的内部类之中,只需直接将他们的名字加载器外围类标识符与“$”的后面。
十一.持有对象
1.collection在每个槽内只能保存一个元素。此类容器包括:List,他以特定的顺序保存一组元素;set元素不能重复;queue,只允许在容器的一端插入对象,并从另一端移除对象.Map在每个槽内保存了两个对象,即键和与之相关联的值。
2.在collection中打印出来的内容可以用方括号括住,每个元素由逗号分隔。Map则用大括号括住,键与值由等号联系(键在等号左边,值在右边)。
3.toArray()方法将任意的Collection转化为一个数组。这是一个重载方法,其无参数版本返回的是Object数组,但是如果你向这个重载版本传递目标类型的数据,那么它将产生指定类型的数据(假设它能通过类型检查)。如果参数数组太小,存放不下list中的所有元素,toArray方法将创建一个具有合适尺寸的数组。
4.接受对象容器并传递它,从而在每个对象上都执行操作,这种思想十分强大,并且贯穿整本书。
5.迭代器统一了对容器的访问方式(能够将遍历序列的操作与序列底层的结构分离)。
6.set不保存重复的元素。
十二.通过异常处理错误
1.java的基本理念是“结构不佳的代码不能运行”
2.Java使用异常来处理已知的错误报告模型,使得构件能够与客户端代码可靠的沟通问题。
3.异常处理程序的任务是:将程序从错误状态中恢复,以使程序能要么换一种方式运行,要么继续运行下去。
4. 在异常处理程序调用了Throwable类声明的printStackTrace()方法,它将打印“从方法调用处直到异常抛出处”的方法调用序列,信息被自动捕获和显示在输出中。
5.Throwable这个java类被用来表示任何可以作为异常抛出的类
6.无论异常是否被抛出,finally子句总能被执行。
7.当要把除了内存之外的资源恢复到它们的状态的时候,就要用到finally子句,这种需要清理的资源包括:已经打开的文件或者是网络连接,在屏幕上画的图形,甚至可以是外部世界的某个开关。
8.有两种可以获得Throwable对象的方法:在catch子句中使用参数或者用new操作符创建。
9.特别注意下面这一行:throw new NullPointerException("demo");
这里,new用来构造一个NullPointerException实例。所有的Java内置的运行时异常有两个构造函数:一个没有参数,一个带有一个字符串参数。当用到第二种形式时,参数指定描述异常的字符串。如果对象用作 print( )或println( )的参数时,该字符串被显示。这同样可以通过调用getMessage( )来实现,getMessage( )是由Throwable定义的。
十三.字符串
1.当你创建一个Formatter对象的时候,需要向其构造器传递一些信息,告诉它最终的结果将向哪里输出
2.在将precision应用于String时,它表示打印String时输出字符的最大数量。而在将precision应用于浮点数的时候,它表示小数部分要显示出来的位数,如果小数位数过多则舍入,太少则在尾部补零。由于整数没有小数部分,所以precision无法应用于整数,如果你对整数应用precision,则会触发异常。
3.将%b应用于非布尔类型的对象请格外小心,因为在对于其他的类型中值不为null的情况下转化结果为true
4.如果想表示一位数字,那么正则表达式应该是\\d。如果你想插入一个普通的反斜线,应该为\\\\,不过换行和制表符之类的东西只需要使用单反斜线:\n\t
5.在java中,\\的意思是“我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义”,转义后使之成为一个普通字符
6.判断一个句子是否以大写字母开头,使用“^[A-Z].*[\\.]$”
7.将a和b分割开的语句是“split("a|b")
8.量词描述了一个模式吸收输入文本的方式:贪婪型,勉强型,占有型
十四.类型信息
1.在产生类的对象的时候运行这个程序的java虚拟机将使用被称为“类加载器”的子系统
2.类加载器子系统实际上可以包含一条类加载器链,但是只有一个原生类加载器,它是JVM实现的一部分,原生类加载器加载的是所谓的可信类,包括java api类,它们通常是从本地盘加载的。
3.所有的类都是在使用的时候动态加载到jvm中的
4.在为类准备的时候实际上包含三个步骤:加载,链接,初始化
5.如果一个static域不是final的,那么在对它访问的时候,总是要求在他被读取之前,要此案进行链接和初始化。
6.interface关键字的一种重要目标就是允许程序员隔离构件,从而降低耦合性
7.面向对象编程语言的目的是让我们在凡是可以使用的地方都使用多态,而只在必需的时候使用rtti