有没有一种方法在调用时不调用子类方法?

时间:2019-08-16 09:11:46

标签: java inheritance methods subclass

我想用Java创建自己的数据库程序。我知道已经有解决方案,例如sylite等,但我想自己做。由于事实证明它比最初预期的要复杂,因此我使用了大量继承来保持概述。例如:

  • 第一类是RawStreamManager,用于使用FileOutputStream处理流到文件
  • 第二类是SessionManager,以防止使用某种csma / cd策略进行多重访问
  • 还有更多类可以做其他事情。

但是,我现在的问题是,当我调用例如方法SessionManager。我想这是有充分的理由的,但是在我的情况下,当客户端没有令牌时,弄清楚客户端拥有权限并将字符串拆分成数据库是没有意义的(读/无需多次访问即可写)。因此,我正在寻找一种方法来调用read()的{​​{1}}方法(还有一些我需要的情况),而不是子类read()方法

我已经尝试在调用read()之前将SessionManager强制转换为read()对象,但这无济于事。 一种解决方法是为这些方法赋予不同的名称。

为了给大家展示一些代码,而又不打扰我,我在这里简化了数据库代码:

SessionManager
SessionManager

现在我希望输出为:

read()

但是(第3行):

public class First {
    public First() {
        System.out.println("syso from first:");
        ((First) this).print();
    }

    public void print() {
        System.out.println("FIRST");
    }
}

那么,请问您中有人可以解决该问题吗? 预先谢谢你。

2 个答案:

答案 0 :(得分:3)

由于您正在创建Second类的实例,因此,在调用Second的构造函数时,将隐式调用对超类构造函数First()的调用,以隐式调用。 super()通话中的Second()

尽管您将类型this强制转换为First,但由于动态/运行时多态性的性质,它仍将调用Second类的重写方法。在Java中。在运行时,JVM检查实例并调用其实例的方法,而不是引用的方法。

为避免产生预期的输出,您需要使打印方法静态化或完全使用其他方法名称:

class First {
    public First() {
        System.out.println("syso from first:");
        First.print();
    }

    public static void print() {
        System.out.println("FIRST");
    }
}
 class Second extends First{
    public static void main(String[] args) {
        new Second();
    }

    public Second() {
        System.out.println("syso from second:");
        Second.print();
    }


    public static void print() {
        First.print();
        System.out.println("SECOND");
    }
}

输出:

syso from first:
FIRST
syso from second:
FIRST
SECOND

静态版本在类属于而不是实例的情况下,提供了预期的输出作为方法。在类Second中,我隐藏了,但没有覆盖基类print()的{​​{1}}。

答案 1 :(得分:0)

在@Amardeep Bhowmick回答之后,可能在某些情况下您可能不希望该方法为静态方法。我相信问题本身更多地与代码组织有关。避免在类构造函数中调用方法:

public class First {
    public First() {
        System.out.println("syso from first:");
    }

    public void print() {
        System.out.println("FIRST");
    }
}

public class Second extends First{

    public static void main(String[] args) {
        new Second();
    }

    public Second() {
        super.print();
        System.out.println("syso from second:");
        this.print();
    }

    @Override
    public void print() {
        super.print();
        System.out.println("SECOND");
    }
}

唯一的区别是您在构造函数之外调用函数,而不是实例化First的那一刻,例如使用new First().print()