《Java编程思想》第5章——初始化与清理
- 构造器是一种特殊类型的方法,因为它没有返回值,这与返回值为void明显不同。
- 每个重载的方法都必须有一个独一无二的参数类型列表,甚至参数顺序的不同也足以区分两个方法,不过一般情况不这么做,因为这会使代码难以维护。需要注意的是,通过返回值来区分重载方法是行不通的。
- 如果你写的类中没有构造器,则编译器会自动帮你创建一个默认构造器。如果你已经定义了一个构造器(无论是否有参数),编译器就不会帮你自动创建默认构造器。
- this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。this关键字对于将当前对象传递给其他方法也很有用。
- 在构造器中可以通过this调用另一个构造器,但却不能调用两个,此外,必须将构造器调用置于最起始处,否则编译器会报错。在类中除构造器之外,编译器禁止在其他任何方法中调用构造器。
- static方法就是没有this的方法,在static方法的内部不能调用非静态方法。
- 一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。所以可以用finalize()在垃圾回收时刻做一些重要的清理工作。但finalize()不能滥用,因为垃圾回收器和与垃圾回收有关的任何行为(包括finalize()),它们都必须同内存技巧回收有关,这就对finalize()的需求限制到一种特殊情况,即通过某种创建对象方式以外的方式为对象分配了存储空间。
- 如果JVM并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。
- 在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化。
- static不能用于局部变量,它只能作用于域。
- 静态块,仅执行一次:当首次生成这个类的一个对象时,或者首次方法属于那个类的静态数据成员时。即静态初始化只在Class对象(区别于一般对象)首次加载的时候进行一次。
- 初始化顺序:父类的(静态变量、静态初始化块)=> 子类的(静态变量、静态初始化块)=> 父类的(变量、初始化块、构造器)=> 子类的(变量、初始化块、构造器)。
《Java编程思想》第6章——访问权限控制
- 每一个class文件都只能有一个public类,public类的名称必须完全与含有该编译单元的文件名相匹配。
- 类既不可以是private也不可以是protected的(内部类除外),类的访问权限仅有两个选择:包访问权限或public。
- 默认访问权限没有加任何关键字,通常是指包访问权限。
- protected也提供包访问权限,也就是说相同包内的其他类可以访问protected类。
- 访问权限控制可以确保不会有任何客户端程序员依赖于某个类的底层实现的任何部分。
《Java编程思想》第7章——复用类
- 当创建一个类时,总是在继承,因此,除非已明确指出要从其他类中继承,否则就是在隐式地从Java的标准根类Object进行继承。
- 当创建了一个导出类的对象时,该对象包含了一个基类的子对象。这个子对象与你用基类直接创建的对象是一样的。Java会自动在导出类的构造器中插入对基类构造器的调用。
- 如果没有默认的基类构造器,或者想调用一个带参数的基类构造器,就必须用关键字super显示地编写调用基类构造器的语句,并配以适当的参数列表。同时,调用基类构造器必须是你在导出类构造器中要做的第一件事。
- “is-a”的关系是用继承来表达的,而“has-a”的关系则是用组合来表达的。
- “为新的类提供方法”并不是继承技术中最重要的方面,其最重要的方面是用来表现新类和基类之间的关系。
- 由于向上转型是从一个较专用类型向较通用类型转换,所以总是很安全的。
- 到底是该用组合还是继承,一个最清晰的判断方法就是问一问自己是否需要从新类向基类进行向上转型。如果必须向上转型,则继承是必要的;但如果不需要,则应当好好考虑自己是否需要继承。
- 对于基本类型,final使数值恒定不变,而用于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象,然而对象自身却是可以被修改的。
- 数组也是对象。
- 根据惯例,既是static又是final的域将用大写表示,并用下划线分隔各个单词。必须在域的定义处或者每个构造器中用表达式对final进行赋值,这正是final域在使用前总是被初始化的原因所在。
- final确保在继承中使方法行为保持不变并且不会被覆盖。
- 类中所有private方法都隐式地指定为是final的。
- 当将某个类的整体定义为final时,就表明了你不打算继承该类,而且也不允许别人这样做。由于final类禁止继承,所以final类中所有的方法都隐式指定为是final的。
- 如果将项目视作是一种有机的、进化着的生命体而去培养,而不是打算像盖摩天大楼一样快速见效,就会获得更多的成功和更迅速的回馈。
《Java编程思想》第8章——多态
- 在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征。多态也称作动态绑定、运行时绑定、后期绑定。
- 继承允许将对象视为它自己本身的类型或其他基类来加以处理。
- 将一个方法调用同一个方法的主体关联起来被称作绑定,若在程序执行之前进行绑定,叫做前期绑定。而后期绑定,它的含义就是在运行时根据对象的类型进行绑定。
- Java中除了static方法和final方法之外,其他所有方法都是后期绑定。
- 那些操作基类接口的方法不需要任何改动就可以应用于新类。
- 多态是一项让程序员将改变的事物与未变的事物分离开来的重要技术。
- 任何域访问操作都将由编译器解析,因此不是多态的。
- 协变返回类型:在Java SE5中添加了协变返回类型,它表示在导出类中的被覆盖方法可以返回基类方法的返回类型的某种导出类型。
- 对于向下转型,如果所转类型是正确的,那么转型成功;否则,就会返回一个ClassCastException异常。
- 为了在自己的程序中有效地运用多态乃至面向对象的技术,必须扩展自己的编程视野,使其不仅包括个别类的成员和消息,而且还要包括类与类之间的共同特征以及它们之间的关系。
《Java编程思想》第9章——接口
- Java提供了一个叫做抽象方法的机制,这种方法是不完整的;仅有声明而没有方法体。包含抽象方法的类叫做抽象类。
- 如果从一个抽象类继承,并想创建该新类的对象,那么就必须为基类中的所有抽象方法提供方法定义。如果不这样做,那么导出类便也是抽象类,且编译器将会强制我们用abstract关键字来限定这个类。
- 使某个类成为抽象类,并不需要所有的方法都是抽象的,所以仅需将某些方法声明为抽象的即可。
- 一个接口表示:“所有实现了该特定接口的类看起来都像这样”。
- 接口也可以包含域,但是这些域隐式地是static和final的。
- 可以继承任意多个接口,并可以向上转型为每个接口。
- 使用接口的核心原因:为了能够向上转型为多个基类类型(以及由此而带来的灵活性)。
- 可以通过继承,在新接口中组合数个接口。
- 接口中的域不是接口的一部分,它们的值被存储在该接口的静态存储区域内。