【问题标题】:Why does my static block allows to call parent class static method without using parentclass reference? [duplicate]为什么我的静态块允许在不使用父类引用的情况下调用父类静态方法? [复制]
【发布时间】:2023-04-05 11:34:01
【问题描述】:

据我了解,通常静态方法应该使用类的引用来调用,或者如果它在静态方法或静态块中,则可以直接调用而不引用。

但这适用于从子类静态块调用静态方法时吗?

为什么它允许这样的事情,因为静态方法不被继承,它应该只允许使用父类名对吗?

public abstract class abs {

    /**
     * @param args
     */
    abstract void m();
    static void n(){
        System.out.println("satic method");
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}
class myclass extends abs{

    @Override
    void m() {
        // TODO Auto-generated method stub

    }
    static{
        n();
    }
}

为什么我的子类静态块可以在没有引用或类名的情况下调用父类静态方法?

【问题讨论】:

  • 静态方法被继承。
  • 看看this question关于Java中的静态方法继承

标签: java static-methods static-block


【解决方案1】:

静态方法n()被子类myclass继承,所以可以直接在myclass的静态块中调用。

【讨论】:

  • 这是否违反了“静态属于类,因此不能被继承”的整个概念?
  • "继承的静态(类)方法和继承的非静态(实例)方法的唯一区别是,当你写一个具有相同签名的新静态方法时,旧的静态方法只是被隐藏了,没有被覆盖。”这是有道理的
  • @amarnathharish 没有这样的概念。你错了。
【解决方案2】:

因为您继承了父类,所以您可以直接访问该类的所有非私有成员,就好像它属于子类一样。

【讨论】:

    【解决方案3】:

    通常应该使用类的引用来调用静态方法或 如果它在静态方法中,则可以直接调用而无需引用 或静态块。

    不是真的。例如,实例方法可以调用静态方法而无需为类添加前缀。

    更一般地说,static 成员(作为方法的字段)只能通过在其类前面加上前缀来调用,因为编译器无法推断它们所属的类。
    当您从子类调用父类中定义的静态方法时(并且静态方法在子类中继承),您不需要像编译器推断的那样为方法调用的类添加前缀。

    【讨论】:

    • 好的,我有一个问题,如果继承了静态方法,如果我在子类中也有另一个具有相同方法签名的静态方法怎么办?编译器将如何解决这个问题?
    • 在这种情况下,子类中定义的方法会影响(而不是覆盖)父类中定义的方法。请注意,这通常是一种不好的做法。没有任何前缀,在类上下文中编译器会选择当前类的方法。
    【解决方案4】:

    父类的所有成员都被子类继承,其中也包括静态方法。

        class SuperClassA {
    
        static void superclassmethod() {
            System.out.println("superclassmethod in Superclass ");
        }
    }
    
    public class SubClassA extends SuperClassA {
        static {
            superclassmethod();
        }
    
        public static void main(String[] args) {
    
        }
    }
    

    但是当超类的静态方法被覆盖时,它会隐藏超类的静态方法而不是覆盖它。

    【讨论】:

    • 没有覆盖静态方法这样的事情。
    • @EJP 我的意思是,如果在子类中编写一个与超类中存在的静态方法同名的静态方法,那么在这种情况下,子类方法不会覆盖超类静态方法但它隐藏了超类的静态方法。而且当它是静态方法时,运行时多态也不会被应用。
    【解决方案5】:

    为什么它允许这样的事情

    通过继承。

    因为静态方法不会被继承

    你一直这么说。你错了。来自JLS #8.4.8

    C 类从其直接超类继承所有满足以下所有条件的超类的具体方法 m(static 和实例):...

    如需继续,请参阅here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 2018-01-30
      • 2021-10-01
      • 1970-01-01
      • 2023-01-30
      相关资源
      最近更新 更多