zoukankan      html  css  js  c++  java
  • 继承多态绕点 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里面 重载,继承的情况下方法的访问顺序

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

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

  • 相关阅读:
    BOM
    定位
    浮动
    行内元素和块级元素
    Java SE之正则表达式五:切割
    Java SE之正则表达式四:获取
    Java SE之正则表达式三:替换
    Java SE之正则表达式二:匹配
    Java SE之正则表达式一:概述
    [C++]PAT乙级1012.数字分类 (20/20)
  • 原文地址:https://www.cnblogs.com/gw2010/p/3475527.html
Copyright © 2011-2022 走看看