今天在看《Head First设计模式》的工厂方法时,文中提到简单工厂方法采用静态方法的不足:不能通过继承来改变创建方法的行为。平时没有注意到这一点,查了些资料和做了些实验,特此记录下来。
Parent.java类
public class Parent {
public String normalStr = "Normal member of parent.";
public static String staticStr = "Static member of parent.";
public void normalMethod(){
System.out.println("Normal method of parent.");
}
public static void staticMethod(){
System.out.println("Static method of parent.");
}
}
Child.java类
public class Child extends Parent {
public String normalStr = "Normal member of child.";
public static String staticStr = "Static member of child.";
public void normalMethod(){
System.out.println("Normal method of child.");
}
public static void staticMethod(){
System.out.println("Static method of child.");
}
}
测试类Main.java类
public class Main {
public static void main(String[] args) {
Child child = new Child();
System.out.println(child.normalStr);
System.out.println(Child.staticStr);
child.normalMethod();
Child.staticMethod();
System.out.println("-------------------------------------------------");
Parent child1 = new Child();
System.out.println(child1.normalStr);
System.out.println(Parent.staticStr);
child1.normalMethod();
Parent.staticMethod();
}
}
得到的结果:
Normal member of child.
Static member of child.
Normal method of child.
Static method of child.
-------------------------------------------------
Normal member of parent.
Static member of parent.
Normal method of child.
Static method of parent.
结论
对于非静态的属性和方法
- 对于非静态属性,子类可以继承父类的非静态属性。但是当子类和父类有相同的非静态属性时,并没有重写并覆盖父类的非静态属性,只是隐藏了父类的非静态属性。
- 对于非静态的方法,子类可以继承父类的非静态方法并可以重写覆盖父类的非静态属性方法。
对于静态的属性和方法
- 对于静态的属性,子类可以继承父类的静态属性。但是和非静态的属性一样,会被隐藏。
- 对于静态的方法,子类可以继承父类的静态方法。但是子类不可重写覆盖父类的静态方法,子类的同名静态方法会隐藏父类的静态方法。