组合优于Java继承

dr_*_*dev 1 java

以下段落引自Bruce Eckel的书"Thinking in Java".

组合具有很大的灵活性.新类的成员对象通常是私有的,这使得使用该类的客户端程序员无法访问它们.这允许您在不干扰现有客户端代码的情况下更改这些成员.您还可以在运行时更改成员对象,以动态更改程序的行为.接下来描述的继承没有这种灵活性,因为编译器必须对使用继承创建的类设置编译时限制.

我不明白,成员对象如何动态更改,以及它如何优于继承.有人可以解释一下

Era*_*ran 11

如果您的课程延伸ArrayList,您班级的用户可以访问所有公共方法ArrayList.您无法更改类以扩展LinkedList,因为这可能会破坏现有代码.

 public class Inheritence extends ArrayList<String>
 {
     // here your class depends on ArrayList implementation
 }
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您的类具有类型为的私有成员,则List您的类的用户不能直接调用该成员的方法.您可以在运行时决定是将ArrayList实例分配给该成员,还是分配不同的List实现(LinkedList或其他).

public class Composition
{
    private List<String> member;

    public Composition ()
    {
        // here you decide the type of your member during runtime
        if (someCondition) {
            member = new ArrayList<String>();
        } else {
            member = new LinkedList<String>();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)