public class TestAbstract { public static void main(String[] args) throws Exception { Son son = new Son(); Object aaa = son.action("aaa"); System.out.println(aaa.toString()); } } abstract class Father{ public Object action(Object object) throws Exception { object = actionBP(object); System.out.println("oo father"); return object; } abstract protected Object actionBP(Object object) throws Exception; } class Son extends Father{ @Override protected Object actionBP(Object object) throws Exception { return "shit"; } }
抽象父类,实现子类,测试类。
测试类中创建子类对象,使用子类对象可以执行调用抽象类中的非抽象方法(这样的方法是提取共性,省的子类一个一个的去重写,冗余),抽象类中的非抽象方法还可以调用父类中的抽象方法,当然真正执行的一定是拿着子类的对象去调用从父类中继承的方法,方法执行之后,调用的父类中的抽象方法也会变成调用的是子类中的重写的方法。
public class TestAbstract { public static void main(String[] args) throws Exception { Son son = new Son(); Object aaa = son.action("aaa"); System.out.println(aaa.toString()); } } abstract class Father{ public Object action(Object object) throws Exception { object = actionBP(object); System.out.println("oo father"); return object; } abstract protected Object actionBP(Object object) throws Exception; } class Son extends Father{ @Override public Object action(Object object) throws Exception { super.action(object); object = actionBP(object); System.out.println("oo yeah"); return object; } @Override protected Object actionBP(Object object) throws Exception { return "shit"; } }
这种情况下,子类把父类的非抽象方法都给重写了,这样就没啥疑问了,调用的都是子类中的方法,只不过子类方法通过super.action()从新调用了一下父类的方法。