继承概念

时间:2009-12-17 13:32:25

标签: java oop java-ee

在继承概念中,我在超类中有一个静态方法,我将该类继承到一个子类。在这种情况下,静态方法是否继承到子类?

7 个答案:

答案 0 :(得分:8)

请记住,静态方法不是实例方法 - 它们与类有关,而与实例无关。由于派生类可以被认为是基类型,因此可以通过派生类型访问静态方法。

假设:

class A {
    public static void foo(){}
}

class B extends A {
}

然后:

B.foo(); // this is valid

答案 1 :(得分:2)

等等,我站得住了 - 静态方法继承了。有点。但是,它们不像真正的OO继承那样行事。例如,使用这些类:

public class Parent {
   public static void printIt() {
       System.out.println("I'm Parent!");
   }
}

public class Child extends Parent {
    public static void printIt() {
        System.out.println("I'm Child!");
    }
    public static void main(String[] args) {
        Parent child1 = new Child(); 
        Child child2 = new Child();
        child1.printIt();
        child2.printIt();
    }
}

如果您致电child1.printIt(),则会使用Parent.printIt(),因为child1已投放到Parent班级。但是,如果您拨打child2.printIt(),则会使用Child.printIt(),因为它会投放给孩子。所以它不是真正的继承,因为如果你转换为超类型,则重写不会坚持。因此,它不是真正的多态性。

答案 2 :(得分:2)

它是继承的,因为它可以作为任何子类的静态方法访问

你为什么不亲自尝试?

  1. 使用class A
  2. 创建staticMethod()
  3. 创建class B extends A
  4. 尝试使用B.staticMethod()
  5. 调用静态方法

答案 3 :(得分:1)

如果该方法在超类中是public static或protected static,则可以在子类中访问它。所以在这个意义上它是继承的。下面的代码将编译并运行正常。

public class A {
   public static String foo() {
     return "hello world";
   }
}

public class B extends A {
   public void bar() {
      System.out.println(foo());
   }
}

然而,这是对“继承”一词的错误使用,因为它与特定实例无关 - 因此Kaleb的回答。正常的OO设计不会将静态方法视为继承的,并且它会变得非常混乱,尤其是当您开始讨论覆盖它们时。

答案 4 :(得分:0)

父静态方法可以在子类中访问,但不能覆盖。

答案 5 :(得分:0)

是的,您可以继承静态方法。 但是,如果您的静态方法具有私有访问修饰符,则无法继承它

答案 6 :(得分:0)

您可能会关注的另一个(高级)概念是“后期静态绑定”的概念 - 覆盖子类中的静态函数。以下是来自PHP世界的问题,但它适用于所有问题:When would you need to use late static binding?