《疯狂java讲义2》读书笔记——继承与组合

继承与组合 java

        继承是实现类重用的重要手段,但继承带来一个最大的坏处:破坏封装。组合也是实现类重用的重要方式,而采用组合方式来实现类重用则能提供更好的封装性。工具

使用继承的注意点设计

        子类扩展父类时,子类能够从父类继承获得Field和方法,若是访问权限容许,子类能够直接访问父类的Field和方法,至关于子类能够直接复用父类的Field和方法。指针

        封装:每一个类都应该封装它内部信息和实现细节,而只暴露必要的方法给其余类使用。code

        为了保证父类的封装性,设计父类应该遵循以下规则:对象

        》尽可能隐藏父类的内部数据,尽可能把父类的全部Field都设置成private访问类型,不要让子类直接访问父类的Field。继承

        .》不要让子类能够随意访问,修改父类的方法。父类中那些仅为辅助其余的工具方法,应该使用private修饰;若是父类中的方法须要被外部类调用,则必须以public修饰,但又不但愿子类重写该方法,使用final修饰;若是但愿父类的某个方法被子类重写,但不但愿其余类自由访问,则使用protected修饰。字符串

        》尽可能不要在父类构造器中来调用将要被子类重写的方法。class

class Base
{
	public Base() 
	{
		test();
	}
	public void test()
	{
		System.out.println("将被子类重写的方法");
	}
}
public class Sub extends Base
{
	private String name;
	public void test()
	{
		System.out.println("子类重写父类的方法,"+"其name字符串的长度"+name.length());
	}
	public static void main(String[]args)
	{
		//下面代码会引起空指针异常
		Sub s= new Sub();
	}
}

        当系统识图建立Sub对象时,一样会先执行其父类构造器若是父类构造器调用了被其子类重写的方法,则变成调用被子类重写后的方法。当建立Sub对象时,会先执行Base类中的Base构造器,而Base构造器中调用了test方法——并非调用父类的test方法,而是调用的i之类的test方法,此时Sub对象的nameField是null,所以空指针异常。test

        若是想把某些类设置成最终类,即不能被当成父类,则可使用final修饰;使用private修饰这个类的全部构造器,从而保证子类没法调用该类的构造器,也就没法继承该类。使用private修饰的父类,能够另外提供一个静态方法,用于建立该类的实例。

什么状况下须要从父类派生新的子类呢?

        》子类须要额外增长属性,而不单单是属性值的改变。

        》子类须要增长本身独有的行为方式(包括增长新的方法或重写父类的方法)。

利用组合实现复用

        若是须要复用一个类,出了继承外,还能够把该类当成另外一个类的组合成分,从而容许新类直接复用该类的public方法。组合是把旧类对象做为新类的Field嵌入,用以实现新类的功能,用户看到的是新类的方法,而不能看到被起嵌入对象的方法。

什么时候使用继承?组合?

        将一个较为抽象的类改变成能使用与某些特定需求的类使用继承。若是两个类之间有明确的总体,部分的关系,使用组合。

相关文章
相关标签/搜索