1.类设计技巧
- 封装(保证数据私有)。
- 一定要对数据进行初始化。
- 不要使用过多的基本类型,用其他的类(自定义的类)代替多个相关的基本类型的使用。
- 不是所有的域都需要独立的访问器和更改器。
- 将职责过多的类进行分解。
- 类名和方法要能体现出他们的职责。
- 优先使用不可变的类(防止多线程修改时发生错误)
2.多态
一个对象变量可以指示多种实际类型的现象被称为多态。在Java语言中,对象变量时多态的。一个父类变量既可以引用一个父类对象,也可以引用任何一个子类对象。
然而,不能将一个父类的引用赋给子类变量。
3.理解方法调用
假设要调用x.f(args),x是C类的对象。下面是调用过程的详细描述:
- 编译器先列出C类中名为f的方法和其超类中访问属性为public且名为f的方法。(可能存在多个名为f,但参数类型不一样的方法)。
- 重载解析。编译器根据调用方法时提供的参数类型,与上一步列出的方法进行匹配。
- 如果是private方法、static方法、final方法或者构造器,编译器可以准确地知道应该调用哪个方法,这种方式称为静态绑定。
- 当调用的是public方法,编译器会根据x的实际类型,自动选择调用哪个方法,这种方式叫做动态绑定。(例如C类存在一个和C的超类签名相同的f方法,具体调用哪个会根据x引用对象的实际类型来决定)
如果在子类中定义了一个与超类签名(方法名和参数类型)相同的方法,那么子类中的这个方法就覆盖了超类中的这个相同签名的方法。
不过,返回类型不是签名的一部分,因此,在覆盖方法时,一定要保证返回类型的兼容性。允许子类将覆盖方法的返回类型定义为原返回类型的子类型。(可以将覆盖方法的返回类型改写为子类的类型)
4.final关键字
final修饰变量的时候,表示该变量为常量,一旦赋值,变量的值便不再更改。
final修饰类的时候,表示该类不允许被扩展,即不可被继承。
final修饰方法的时候,表示子类不能覆盖该方法。
如果将一个类声明为final,只有其中的方法自动成为final,而不包括域。