【问题标题】:How can i call child's static method from parent's static method?如何从父静态方法调用子静态方法?
【发布时间】:2015-01-15 21:59:07
【问题描述】:

我有一个基类

public class BaseStatic {
    public static String fname = "Base";
    public static String lname = "Static";

    public static void send(){
        System.out.println("BaseStatic send");
        sendTo();
    }

    public static void sendTo(){
        //How to call from here Child's static method.
        System.out.println("BaseStatic sendTo");
    }
}

我有一个扩展它的子类。

public class FirstStatic extends BaseStatic {
    public static String fname = "First";
    public static String lname = "Static";

    public static void sendTo(){
        System.out.println("FirstStatic sendTo");
    }
}

现在有一个主类

public class Main {
    public static void main(String args[]){
        FirstStatic.send();
    }
}

java 是否为我提供了一种方法,以便当我从 Main 方法 FirstStatic.send 调用时,它转到 BaseStatic 的 send 方法,从那里我可以调用 FirstStatic 的 sendTo 方法而不是调用 BaseStatic 的 sendTo 方法

【问题讨论】:

  • 我的 FirstStatic 类不想修改自己的 send 方法所以想使用,但问题是必须从 send 方法调用 sendTo 方法。现在要么我也应该在 FirstStatic 中编写一个方法发送,或者我应该有一些方法从 BaseStatic 的发送方法调用 FirstStatic.sendTo
  • 你的意思是发送方法?因为 sendTo 方法已经在 FirstStatic 中了。
  • 你不能用static方法做你想做的事。为什么这些方法必须是static

标签: java inheritance static


【解决方案1】:

静态方法没有多态性。因此,要调用A类的静态方法x,必须写成A.x()

FirstStatic.send() 将调用BaseStaticsend 只是因为FirstStatic 没有静态send 方法。但是,BaseStaticsend 将始终调用 BaseStaticsendTo,除非您明确调用 FirstStatic.sendTo()

【讨论】:

  • 看看当我在 send 方法中调用 FirstStatic.send 或 BaseStatic.send 时,有没有办法可以找出调用此方法的类名。
  • @AdonSmith 没有。只要 FirstStatic 没有 send 方法,两个调用都是相同的。
【解决方案2】:

这里注释掉的 sendTo() 方法会产生隐藏基类中 sendTo() 的实现的效果。

public class BaseStatic {
    public static String fname = "Base";
    public static String lname = "Static";

    public static void send(){
        System.out.println("BaseStatic send");
        sendTo();
    }

    public static void sendTo(){
        //How to call from here Child's static method.
        System.out.println("BaseStatic sendTo");
    }

    public static void main(String[] args) {
        FirstStatic.sendTo();
    }
}

class FirstStatic extends BaseStatic {
    public static String fname = "First";
    public static String lname = "Static";

    //public static void sendTo(){
    //    System.out.println("FirstStatic sendTo");
    //}
}

当然,您可以执行以下操作,但最终效果与上面显示的代码相同。如果您需要多态性,则需要取消静态 - 无论如何,这可能是个好主意!

public class BaseStatic {
    public static String fname = "Base";
    public static String lname = "Static";

    public static void send(){
        System.out.println("BaseStatic send");
        sendTo();
    }

    public static void sendTo(){
        //How to call from here Child's static method.
        System.out.println("BaseStatic sendTo");
    }

    public static void main(String[] args) {
        FirstStatic.sendTo();
    }
}

class FirstStatic extends BaseStatic {
    public static String fname = "First";
    public static String lname = "Static";

    public static void sendTo(){
        BaseStatic.sendTo();
    }
}

编辑:这些示例的结构使您可以轻松地执行以下操作来验证行为。

javac BaseStatic.java
java BaseStatic

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    相关资源
    最近更新 更多