public class Test2{
public static void main(String[] args){
Father f = new Son();
f.read();
f.run();
//Father f1 = new Father();//Father类是抽象类,无法对其进行实例化
//f1. read();
//f1.run();
Son s = new Son();
s.run();
s.write();
s.read();
}
}abstract class Father{
public void read(){
System.out.println("father.read().");
}
public abstract void run();
}class Son extends Father{
public void run(){
System.out.println("son.run().");
}
public void write(){
System.out.println("son.write().");
}
} 为什么一定用Father f = new Son();来实例化对象比较好啊?我觉得Son s = new Son();实例化方法更好,它不仅可以访问到子类自己的成员方法和重写父类的方法,还可以访问父类的方法,而Father f = new Son();实例化方法不能访问到子类自己的方法呀,虽然第一种用的是多态思想,我看不出来它好在哪边?
public static void main(String[] args){
Father f = new Son();
f.read();
f.run();
//Father f1 = new Father();//Father类是抽象类,无法对其进行实例化
//f1. read();
//f1.run();
Son s = new Son();
s.run();
s.write();
s.read();
}
}abstract class Father{
public void read(){
System.out.println("father.read().");
}
public abstract void run();
}class Son extends Father{
public void run(){
System.out.println("son.run().");
}
public void write(){
System.out.println("son.write().");
}
} 为什么一定用Father f = new Son();来实例化对象比较好啊?我觉得Son s = new Son();实例化方法更好,它不仅可以访问到子类自己的成员方法和重写父类的方法,还可以访问父类的方法,而Father f = new Son();实例化方法不能访问到子类自己的方法呀,虽然第一种用的是多态思想,我看不出来它好在哪边?
打个比方,若一个父类下有多个子类,父类为交通工具,子类分别为车,船,飞机,
人这个类里有一个启动的方法,需要的参数是这些交通工具,但启动的是车、船还是飞机,要看具体情况,
若按你的思路,就要为每个子类写一个方法run(Car c),run(Plane p)...
若使用向上转型,只需写一个方法run(Tools t)就可以了,
这样只有在运行时刻才知道对象具体是哪一个类的,并不是在你写代码的时候就确定参数对象是哪一个类的。
这样做可以实现代码复用,减少了重复工作,节省了劳动力。
public void test(Father father){
}
原来你直接传递的Son类型的对象,没有问题;但是后来由于某些原因,你想不用Son 类型的对象了,而其他类型的对象如Daught类型的对象(Daughter要继承Father),那么上面的方法不用任何改动,只需要实现Daughter类即可。符合 设计模式中的 对修改封闭,对扩展开放 的原则,代码更灵活。定义使用接口或者抽象类的一个重要原因就是易于更换子类实现,而不修改参数,以统一的方式使用。往大了说就是规范,如Servlet规范(Servlet规范中基本全是接口,具体实现由各个web容器实现,如tomcat等,我们在使用的时候知道Servlet规范就可以)
即father类好比是一个工厂,son类好比是工厂生产的产品。这样做的好处是避免了大量代码的重复,在此例中即表现在所有的对象都有read()方法,但run()方法则可能不一样。
跟你推荐一本书吧:大话设计模式,用大话西游的模式写的,有趣又有用