【问题标题】:Why can't I implement abstract method as private method [duplicate]为什么我不能将抽象方法实现为私有方法[重复]
【发布时间】:2019-07-14 08:00:35
【问题描述】:

用抽象类

abstract class A {
    abstract int getInt();
}

和实现

public class AImp extends A{
    @Override
    private int getInt() {
        return 1;
    }
}

我得到的错误是我不能给这个方法比它已经拥有的更少的访问权限。我想将抽象方法实现为私有方法。我明白为什么我不能在Aprivate abstract 中定义抽象方法,因为那样会使实现无法看到方法,但是为什么不能简单地将抽象方法设为私有呢?

理由:

我有两个类,它们的方法相同,但依赖于私有方法:

public class AImp1{
    private int getInt() {
        return 1;
    }
    protected void print10Int() {
        for (int i = 0; i < 10; i++){
            System.out.println(getInt());
        }
    }
}

public class AImp2{
    private int getInt() {
        return 0;
    }
    protected void processInt() {
        for (int i = 0; i < 10; i++){
            System.out.println(getInt());
        }
    }
}

为了避免代码重复,我想将该方法放在抽象超类中,但这迫使我也将私有方法作为抽象超类的一部分:

abstract class A {
    abstract int getInt();

    protected void print10Int() {
        for (int i = 0; i < 10; i++){
            System.out.println(getInt());
        }
    }
}

因为我想要和以前一样的AImp1AImp2,所以我想将getInt 设为私有:

public class AImp1 extends A{
    @Override
    private int getInt() {
        return 1;
    }
}

这是导致错误的原因。

【问题讨论】:

  • 为什么要在私有方法中实现呢?什么原因?
  • 如果你把它设为私有,它就看不到,因此即使抽象超类这么说也不能从外部调用它
  • 我不知道你不能 - 从未尝试过。但是声明一些需要被覆盖的东西(抽象需要一个实现)但不能声明是绝对没有意义的,因为根据定义,私有方法不能。由于可分配给超级,因此将子中的某些私有内容更改为私有会击败私有。
  • 您正在更改方法的行为/签名,就像覆盖它并返回一个双精度值一样。简直违法
  • @Sahand 我明白了。不幸的是,您不能将其设为私有。只需将其设为protected,除非所有类都在同一个包中,在这种情况下,您可以将其设为包范围

标签: java


【解决方案1】:

因为它被用作类签名/接口的一部分。假设我知道 A 类的孩子将有方法 Foo(),但是当我尝试访问扩展 A 类的 B 类的 Foo() 时,我不能,因为它是私有的。没有意义。

【讨论】:

  • 是的,但是如果抽象方法本身是私有的......不幸的是,这在 Java 中是不允许的。
  • @DodgyCodeException 我现在读到 Java 9+ allows 接口声明私有方法。
  • 确实如此,但与这个问题无关。接口中的私有方法只能被同一接口中的默认方法访问。它们不能被覆盖。在其他语言中,例如 C++,抽象方法可以是私有的,因此可以被私有方法覆盖。
猜你喜欢
  • 2015-06-26
  • 2011-02-21
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
相关资源
最近更新 更多