【发布时间】:2019-07-14 08:00:35
【问题描述】:
用抽象类
abstract class A {
abstract int getInt();
}
和实现
public class AImp extends A{
@Override
private int getInt() {
return 1;
}
}
我得到的错误是我不能给这个方法比它已经拥有的更少的访问权限。我想将抽象方法实现为私有方法。我明白为什么我不能在A 和private 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());
}
}
}
因为我想要和以前一样的AImp1 和AImp2,所以我想将getInt 设为私有:
public class AImp1 extends A{
@Override
private int getInt() {
return 1;
}
}
这是导致错误的原因。
【问题讨论】:
-
为什么要在私有方法中实现呢?什么原因?
-
如果你把它设为私有,它就看不到,因此即使抽象超类这么说也不能从外部调用它
-
我不知道你不能 - 从未尝试过。但是声明一些需要被覆盖的东西(抽象需要一个实现)但不能声明是绝对没有意义的,因为根据定义,私有方法不能。由于可分配给超级,因此将子中的某些私有内容更改为私有会击败私有。
-
您正在更改方法的行为/签名,就像覆盖它并返回一个双精度值一样。简直违法
-
@Sahand 我明白了。不幸的是,您不能将其设为私有。只需将其设为
protected,除非所有类都在同一个包中,在这种情况下,您可以将其设为包范围
标签: java