30小时训练完成度:17h/30h
第五章习题GitHub链接点击阅读原文
Java最棒的特性就是代码重用
代码重用通过两种方式实现
组合在新创建的类中构建已有类的实例,并在类变量中持有其引用。
classFooter{publicFooter(){}}
classBird{privateFootermFooters;...
组合是一种非常直观的使用方式,只要需要使用到相应类的功能,就可以在需要的地方,声明该变量,并创建相应的实例。
相对于继承来说,使用组合是一种更便利的代码复用方式。
在一个类中可以组合多个需要的功能类,而继承只能单根继承
组合有更低的耦合度,在组合内使用的功能类,使用的都是其暴露出的接口,而内部实现则完全不需要关心
如果可以使用组合来完成的功能,尽可能的考虑不要使用继承来完成,减少类之间的复杂关系。
继承创建一个已有类的新类型,使用extend来定义类的继承
classBirdextendAnimal{......}
父类的构造方法
1使用默认构造方法时,也就是不带任何参数的构造方法,子类会自动调用父类的构造方法。
classAnimal{publicAnimal(){System.out.println("Baseclassconstructorcalled");}}classBirdextendAnimal{publicBird(){System.out.println("Drivedclassconstructorcalled");}}
2而在使用带有参数的构造方法时,必须**首先**显式调用父类的构造方法,再完成其他初始化工作
classAnimal{publicAnimal(){System.out.println("Baseclassconstructorcalled");}}classBirdextendAnimal{privateStringmName;publicBird(Stringname){super();mName=name;System.out.println("Drivedclassconstructorcalled");}}清理工作
Java和C++不同,没有特定的清理方法。垃圾回收机制虽然能够自动清理内存,但并不在我们的控制范围之内。当需要执行清理工作的时候,需要显式的定义清理方法,并明确的调用该方法。在调用清理方法时,配合finally关键字可以确保清理方法被执行。
classCar{publicvoidrun(){//dosomethingtorun}publicvoidcleanup(){//dosomecleanup...}}classMain{publicvoidstaticmain(String[]args){Carcar=newCar();try{car.run();}finally{car.cleanup();}}}组合和继承何时使用组合
在新类中需要使用已有类的功能时,就可以使用组合,在逻辑上,组合关系就是hasa的关系。
组合关系中,新类不需要暴露已有类的接口
组合关系中,新类需要使用已有类的功能
何时使用继承protected通过protected关键字,可以把父类方法的控制权限开发给子类。子类可以通过覆盖protected方法来改变该方法的行为。
增量开发继承中,子类可以新增自己的方法和变量,同时又不干扰到父类中的方法和变量(private)。而新增的方法和变量只需要在子类中进行修改/维护。这样就,增量的代码就和原有的代码隔离开来。
向上转型继承虽然是OOP中的重要方法,但不意味着在任何地方都需要使用继承。相反,在使用继承关系时,要仔细考虑是否有使用的必要。
通过是否需要“向上转型”可以简单的判断是否需要采用继承。在不需要“向上转型”的场合,往往继承并不是必需的。
银川治疗白癜风的医院北京中科白癜风医院刘云涛