一个类。仅仅有一个引起它变化的原因。应该仅仅有一个职责。每个职责都是变化的一个轴线。假设一个类有一个以上的职责,这些职责就耦合在了一起。这会导致脆弱的设计。当一个职责发生变化时,可能会影响其他的职责。另外,多个职责耦合在一起,会影响复用性。
比如:要实现逻辑和界面的分离。
也就是说职责P1和P2被耦合在了一起。
比如Iphone接口,打电话分为四个过程,拨号。通话,回拨。挂机。
改动后:
1.子类继承父类的成员变量
当子类继承了某个类之后,便能够使用父类中的成员变量。可是并非全然继承父类的全部成员变量。详细的原则例如以下:
1)可以继承父类的public和protected成员变量;不可以继承父类的private成员变量;
2)对于父类的包訪问权限成员变量,假设子类和父类在同一个包下。则子类可以继承;否则。子类不可以继承。
3)对于子类能够继承的父类成员变量,假设在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。假设要在子类中訪问父类中同名成员变量,须要使用superkeyword来进行引用。
2.子类继承父类的方法
相同地,子类也并非全然继承父类的全部方法。
1)可以继承父类的public和protected成员方法。不可以继承父类的private成员方法;
2)对于父类的包訪问权限成员方法,假设子类和父类在同一个包下,则子类可以继承。否则,子类不可以继承。
3)对于子类能够继承的父类成员方法。假设在子类中出现了同名称的成员方法,则称为覆盖。即子类的成员方法会覆盖掉父类的同名成员方法。
假设要在子类中訪问父类中同名成员方法,须要使用superkeyword来进行引用。
注意:隐藏和覆盖是不同的。隐藏是针对成员变量和静态方法的,而覆盖是针对普通方法的。(后面会讲到)
3.构造器
子类是不可以继承父类的构造器,可是要注意的是。假设父类的构造器都是带有參数的,则必须在子类的构造器中显示地通过superkeyword调用父类的构造器并配以适当的參数列表。假设父类有无參构造器,则在子类的构造器中用superkeyword调用父类构造器不是必须的,假设没有使用superkeyword,系统会自己主动调用父类的无參构造器。
子类必须全然实现父类的方法就是为了代码复用。
每一个方法必须有所用处,父类中的參数范围尽管没有子类的大。子类的重载是为了扩展。弥补了父类的不足。一般来说,是不会去重载的。
public class Father {
public Collection doSomething(Map map){
System.out.println("父类:Map 转集合");
return map.values();
}
}
Son 类
public class Son extends Father {
public Collection doSomething(HashMap map) {
System.out.println("子类:Hashmap 转集合");
return map.values();
}
}
測试类
public static void main(String[] args) {
Son f=new Son(); //俩个方法 一个
HashMap h=new HashMap();
f.doSomething(h); //子类
}
结果:
子类:Hashmap
转集合
參考书籍:
《设计模式之禅》
參考文章:
我是菜鸟,我在路上。