复用代码的两种方法:java
一、组合,将对象的引用用于新类;编程
二、继承。ide
7.1函数
每个非基本类型的对象都有一个toString()方法,并且当编译器须要一个String而却只有一个对象时,toString()方法将会被调用。测试
7.1的倒数第二段最后一句话不明白,查了一下英文原版,我以为能够这么翻译:优化
若是没有在定义处初始化,将不能保证发送给对象的引用信息前(按做者前文所述,发送给对象的引用信息能够理解为咱们常说的调用对象的方法)它会被初始化,这样将会形成运行时异常。命令行
7.2翻译
Java中能够为每一个类都建立main()方法。即时一个程序中包含多个类,也只有命令行所调用的那个类的main()方法会被调用。即时类Cleanser不是一个public类,若是命令行滴啊用java Cleanser,那么Cleanser.main()仍然会被调用。即便那个类只有包访问权限,其public main()仍然是可访问的。对象
在一个main内部还能够显示的调用另外一个类的main。继承
当建立了一个导出类的对象时,该类包含了一个基类的子对象。这个子对象与用基类直接建立的对象是同样的。两者的区别在于后者来自于外部,而基类的子对象被包装在导出类对象内部。
练习5是想告诉咱们,导出类中若是在定义处初始化的对象,他们执行的顺序是:
基类的构造函数——导出类中定义处初始化的对象——导出类的构造函数。
通过编程测试,这个顺序不管导出类有无默认构造函数,构造函数中是否显示调用super()都成立。
7.4
若是基类拥有某个已经被屡次重载的方法名称,导出类中另外定义一个重载的版本并不会屏蔽在基类中的任何版本(这种特性与C++不一样)。所以,不管在该层或者它的基类中对方法进行定义,重载机制均可以正常工做。
这种机制多是会代码变得混乱,从1.5开始增长了@Override注解。当要覆写某个方法时,能够选择添加这个注解,在不留心重载而不是覆写了这个方法,编译器就会报错。简言之,@Override注解能够防止在不想重载时意外的进行了重载。
7.7
做者认为,虽然继承在OOP编程中占用重要的位置,可是应该谨慎使用。究竟是使用组合仍是继承,一个最清晰的判断方法是想想是否须要重新类向基类进行向上转型。若是必须向上转型,则继承是必要的;但若是不须要,应当好好考虑是否须要继承。
练习17在给咱们预习多态的概念,虽然函数函数是基类的引用,可是函数体内是实参(导出类)的方法被调用,而不是基类的。
7.8
使用到final有三种状况:数据、方法和类。
final数据:
final用于基本类型则定义了该类型的一个常量;用于对象,表示该对象的引用恒定不变(而改对象的属性是能够更改的)。
文中说:“在对这个常量进行定义的时候,必须对其进行赋值。”这句话不能理解为必须在定义处赋值,通过编程验证,对于static final能够在static语句块中对其进行赋值,而对于final能够在构造函数中进行赋值。也许做者想表达的意思是定义了常量,就必须在某处进行赋值。
一个既是static又是final的字段只占据一段不能改变的存储空间。带有恒定初值的final static基本类型全用大写字母命名,而且字与字之间用下划线隔开。
咱们不能由于某数据是final的就认为在编译时能够知道它的值。在运行时可以使用随机生成的数值为其初始化。
在参数列表中以声明的方式将参数指明为final。这意味着没法在方法中更改参数引用所指向的对象,或者基本类型的值。这一特性主要用来想匿名内部类传递数据。
final方法:
使用final方法的主要缘由是防止任何继承类覆盖这个方法。
在Java早起实现,使用final方法表明该函数内联,以便来提升代码效率。在Java 5/6中,再也不须要使用final方法来进行优化了。
类中全部的private方法都隐式的指定为final的。由于没法取用private方法,因此也就没法覆盖它。
final类:
不能被继承。final类中的方法隐式的被指定为final的。
7.9
类加载发生于建立类的第一个对象或访问了static域或static方法之时。构造函数是隐式static的。所以更准确的说,类是在其任何static成员被访问时加载。全部的static对象和static代码段都会在加载时依定义类时的书写顺序依次初始化。