复用代码是java众多引人注目的功能之一.但是想要称为革命性的语言,仅仅能够复制代码并堆之加以改变是不够的,它还必须能够做更多的事情.
组合:只需要将一个类的对象引用到另一个类中即可.
继承是所有oop语言和java语言中不可缺少的一部分.
继承机制的存在,也就导致了其实在创建一个对象的时候,会直接创建object对象,然后一级一级的创建所有的父类对象,该对象就拥有了所有父类对象的可以继承的成员.
因此,抽象类和接口只是不能直接new而已,但你在创建它的子类和实现的时候,它们也会在内存中占据一片空间,可以推断java虚拟机在给接口分配内存空间的时候,只会维持一份,因为,接口中的成员都是稳定的,不存在多线程问题.而会为每个子类的抽象类分配单独的内存空间.
java并没有提供对它的直接支持,这是继承和组合的中庸之道.(不详解,请看设计模式之代理)
为什么java里面还需要清理:因为java中有操作流对象的类,这些类的对象必须我们来完成清理,它们的存在对于性能来说是巨大的消耗.
许多情况下,清理并不是问题,但是真正需要我们动手清理时,就得多做努力并且加倍小心.例如上述讲到的流对象.
组合和继承都允许在新的类中放置对象,组合是显示的这样做,而继承是隐式的做.
"为新的类提供方法"并不是继承技术中最重要的方面,其最重要的方面是用来表现子类和父类之间的关系.
历史原因,绘制类图的时候把父类放在上面
判断到底使用组合还是继承,一个最清晰的方法就是问一问自己是否需要从子类向父类进行转型.如果必须转型,则继承是必要的,但如果不需要,则应当好好考虑自己是否需要继承.
一个在运行时被初始化的值,而你不希望它被改变.
一个即时static和final的域只占据一段不能改变的存储空间.
final修饰对象引用,引用不可变,但是对象自身可以变化.
final赋值的时机:1声明 2构造赋值
不能被覆盖
final与private
类中所有的private方法都隐式的声明为private,由于无法使用,所以也无法覆盖,可以共同使用但是没有任何意义.
要预见类是如何被复用的一般是很困难的,特别是对于一个通用类而言更是如此.
java的标准库就是一个很好的例子.java1.0/1.1 vector类被广泛的运用,其中使用final确又使用了同步,完全浪费了final的效率.
hashtable的设计方法要比vector的类库要简洁许多,明显不是同一个人设计,对于通用类库而言,这显得很草率.
因为java中的所有事物都是对象,每个类的编译代码都在自己的class文件中,该文件只在需要使用程序代码时才会被加载.一般来说,"类的代码在初次使用时才加载".
通常发生在创建对象的时候,但是在使用累的static域的时候也会加载.
父类静态,子类静态,父类构造,子类构造,对象元素