继承多态绕点 Java篇

上一篇把C#语言的继承,多态里的特殊的情况做了一下总结,其实那一部分代码都是从Java翻译过去的,今天来总结一下Java在这种情况下是怎么调用的。

上一篇我们说的是:
1.多态,只在多态系里方法调用,很简单,先调重写方法,如果没有再调父类的虚方法。
2.非多态,只自声明时类型,先调自身的方法(比如非继承普通方法,new修饰的方法),如果没有再看继承来的方法,最后再看多态系方法(也就是重写了的方法)

但是Java里做了测试,这个规律不适用,下面是测试代码

  public class Shape {
    }

    public class Rectangle extends Shape {
    }

    public class Triangle extends Shape {
    }

    public class Father {
        public void Draw(Rectangle rect) {
            System.out.println("Father.Draw Rect");
        }

        public void Draw(Triangle tri) {
            System.out.println("Father.Draw Tri");
        }
    }

    public class Son extends Father {
        public void Draw(Shape shape) {
            System.out.println("Son.Draw Sha");
        }
        
        @Override
        public void Draw(Triangle tri) {
            System.out.println("Son.Draw Tri");
        }
    }

调用代码段

        Father fa = m.new Son();
        Son so = m.new Son();

        Shape s = m.new Shape();
        Rectangle r = m.new Rectangle();
        Triangle t = m.new Triangle();

        fa.Draw(r);//1
        fa.Draw(t);

        so.Draw(s);//2
        so.Draw(r);
        so.Draw(t);

//1部分也是满足多态的,所以很简单能看出结果
Father.Draw Rect
Son.Draw Tri
//2部分结果,如下
Son.Draw Sha
Father.Draw Rect
Son.Draw Tri

在多种情况测试下,可以得出Java里面自身方法,继承方法,多态系方法都是同等重要的,没有先后顺序,主要是自身的方法,与继承方法没有先后顺序,当然有了方法重现,也就不会出现继承方法。所以Java里面更好理,只要是非多态里面调用就是这几种方法同等,只要有就会调用,就不会像C#先调自身方法这种情况。所以so.Draw(r)和so.Draw(t) 结果是Father.Draw Rect和Son.Draw Tri,虽然第1个调用自身没有方法,但是有从父类继承来的方法,所以调用。第2个调用有一个重写的方法,因为这几个方法调用顺序平等,所不会调Shape参数的方法,如果没有这个重写的方法就会调继承下来的,如果没有才会调Shape参数的方法。

最后,从这里来看Java要比C#要好理解些,因为没出现virtual,new这些修饰词,统一平等对待。

 

总结一下:

Java里面 重载,继承的情况下方法的访问顺序

没有顺序,自身方法,继承来的方法,多态系方法一视同仁

如果是满足多态的情就简单,表现多态就行了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章