子类可以继承和覆盖父类的static 方法吗?


class UpClass {
  static void hello(String input) {
    System.out.println("UpClass: " + input);
  }

  void hello2(String input) {
    System.out.println("UpClass: " + input);
  }
}


public class StaticExtends extends UpClass {
  static void hello(String input) {
    System.out.println("subClass: " + input);
  }

  void hello2(String input) {
    System.out.println("subClass: " + input);
  }


  public static void main(String[] args) {
    StaticExtends.hello(" ");
    UpClass.hello("  ");
    // 向上转型至父类接口
    UpClass up = new StaticExtends();
    // 调用父类static void hello();
    up.hello(" ");
    up.hello2(" ");

    // 向下转型为子类接口:

    ((StaticExtends) up).hello(" ");
    // 调用子类static void hello();
    ((StaticExtends) up).hello2(" ");
    // 调用子类void hello2();
  }
}

将现在将子类的方法 注释掉,运行程序

结果:

UpClass:  
UpClass:   
UpClass:  
UpClass:  
UpClass:  
UpClass:  

分析:

什么是继承?
class a extends b{....} 

class b{ x() {

} }

如果a中未定义的方法x()在b中定义了,并且可通过a的引用调用x(),那么就说明a继承了b的x()。
如果这么说的话,static方法的确可被继承。


那么static方法可被覆写吗?




  public static void main(String[] args) {
   
    // 向上转型至父类接口
    UpClass up = new StaticExtends();
    // 调用父类static void hello();
    up.hello(" ");
    up.hello2(" ");

  
  }
}

取消对子类方法的注释,运行程序

结果:

  
UpClass:  
subClass:  

分析:

扫描二维码关注公众号,回复: 4588269 查看本文章

什么是覆盖?

class a extends b{ x(){

打豆豆

}} 

class b{ x() {

吃饭 ,睡觉

} }

查看了网上一些资料:说覆盖是:子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。

在《Java编程思想》中提及到:

  “覆盖”只有在某方法是基类的接口的一部分时才会出现。即,必须能将一个对象向上转型为它的基本类型并调用相同的方法。

这里可以肯定的是,普通non-static method hello2()是百分之百覆盖了父类的 hello2,而代码中:

    // 向上转型至父类接口
    UpClass up = new StaticExtends();
    // 调用父类static void hello();
    up.hello(" ");
    up.hello2(" ");

却得到了不一样的结果。 up.hello 运行的父类的方法,up.hello2 运行的子类的重写的方法,这是我感到很困惑到底什么是产生差异的原因,于是我又做了尝试:

 public static void main(String[] args) {
    StaticExtends.hello(" ");
    UpClass.hello("  ");
    // 向上转型至父类接口
    UpClass up = new StaticExtends();
    // 调用父类static void hello();
    up.hello(" ");
    up.hello2(" ");

    // 向下转型为子类接口:

    ((StaticExtends) up).hello(" ");
    // 调用子类static void hello();
    ((StaticExtends) up).hello2(" ");
    // 调用子类void hello2();
  }

结果:

UpClass:  
subClass:  
subClass:  
subClass:  

分析:

隐隐约约的感觉到,static 方法的调用产生不同结果的原因 是它的引用不同 在向上转型时,引用的是父类的方法,向下转型时,引用子类的方法。

而hello2则是真正的覆盖了,在向上转型时 依然引用的是 子类的方法

结论:static是静态的。特点是在类被装载时最先开辟内存空间,而且无论类被实例化多少次都只开辟一次内存空间。他本身与能否继承没有关系。

子类不能覆盖父类的static 方法,当在子类中有一个和父类 同名 同参数类型 的方法时,调用子类的这个方法 运行的是子类的方法原因在于引用改变,而子类没有相似方法时调用的是父类的方法,原因也同样在于子类”继承“了父类的这个方法(其实只是引用父类的方法),当自己“重写”方法是隐藏了对父类静态方法的引用。

通过在子类方法上添加@Overide注解进行验证: 
   

报错:

Description    Resource    Path    Location    Type
The method hello(String) of type StaticExtends must override or implement a supertype method    StaticExtends.java    /RomanAndInt/src/RomanAndInt    line 18    Java Problem

   
在Java中,static方法和final方法(private方法属于final方法)是前期绑定,而其他所有的方法都是后期绑定了。

猜你喜欢

转载自blog.csdn.net/weixin_42851893/article/details/84860620