zoukankan      html  css  js  c++  java
  • Java子类对于父类中static方法的继承

    今天看到了Java中子类继承父类的一个相关讨论,在网上综合了各家的观点,写下了一篇简短的总结。

    问题如下,在父类中含有staic修饰的静态方法,那么子类在继承父类以后可不可以重写父类中的静态方法呢?

    答案是:不能。   

    很多人可能会提出疑问,因为他们在写代码的时候出现过以下代码,举例:

    父类:Animal.java
    public class Animal {

      public Animal() {

      }

      public void run() {

           System.out.println("动物可以奔跑");

      }

      public static void shout() {

          System.out.println("动物可以叫");

      }

    }

    子类:Dog.java
    public class Dog extends Animal

    {

         public Dog() {

            // TODO Auto-generated constructor stub

           }

         public static void main(String[] args) {

             Dog dog = new Dog();

             dog.run();

             dog.shout();

    }

        @Override

        public void run() {

          System.out.println("狗跑得很快");

        }

    public static void shout() {

      System.out.println("狗的叫声是汪汪汪");

      }

    }
    运行Dog.java结果:
    ​​

    这是不是说明子类实现了对父类中静态方法的重写呢?貌似很有道理,然而我们对Dog.java,稍作改动,即将dog向上转型:

    public class Dog extends Animal

    {

       public Dog() {

         // TODO Auto-generated constructor stub

       }

       public static void main(String[] args) {

       Animal dog = new Dog();

       dog.run();

       dog.shout();

    }

    @Override

    public void run() {

       System.out.println("狗跑得很快");

    }

    public static void shout() {

    System.out.println("狗的叫声是汪汪汪");

    }

    }
    运行结果:
    ​​

    说明子类其实并没有实现对父类stati方法的重写,为什么?

    在Java中,如果父类含有一个静态方法,且在子类中也含有一个返回类型,方法名、参数列表等都与之相同的的静态方法,在子类中只是对父类的该同名方法进行隐藏,并不是重写。父类与子类含有的其实是两个没有关系的方法,两者的行为不具有多态性。
    在上面的例子中,shout方法与类发生了关联,而不是与特定的类的实例相关联,它不在乎什么类型的类正在创建它,而仅仅在意引用的类型。在Animal dog = new Dog()中,dog是一个类Dog在内存中的一个Animal类型的引用,如果一个static方法被调用了,jvm不会检查什么类型正在指向它,他只会调用跟Anima类相关联的方法的实例。
    --------------------- 

  • 相关阅读:
    LCA问题
    CSP2019 J组 游记
    树的直径
    动态规划-背包问题
    Diworth定理
    扫描线算法
    线段树2:区间乘法实现
    线段树1:区间查询和区间加法
    Sys.WebForms.PageRequestManagerParserErrorException: 常见的原因是:通过调用Response.Write()修改相应时,将启用响应筛选器、HttpModules或服务器追踪
    10 套华丽的 CSS3 按钮推荐
  • 原文地址:https://www.cnblogs.com/ly570/p/10942328.html
Copyright © 2011-2022 走看看