gpt4 book ai didi

java - 覆盖方法可以具有与基类中不同的访问说明符吗?

转载 作者:IT老高 更新时间:2023-10-28 20:45:36 26 4
gpt4 key购买 nike

在抽象类中,我必须为方法使用哪个访问修饰符,所以子类可以决定它是否应该是公共(public)的?是否可以在 Java 中“覆盖”修饰符?

public abstract class A {

??? void method();
}

public class B extends A {
@Override
public void method(){
// TODO
}
}

public class C extends B {
@Override
private void method(){
// TODO
}
}

我知道静态绑定(bind)会有问题,如果有人打电话:

// Will work
A foo = new B()
foo.method();

// Compiler ?
A foo = new C();
foo.method();

但也许还有另一种方式。我怎样才能做到这一点?

最佳答案

放宽限制是可以的,但不能让它变得更严格:

public abstract class A {
protected void method();
}

public class B extends A {
@Override
public void method(){ // OK
}
}

public class C extends A {
@Override
private void method(){ // not allowed
}
}

使原始方法 private 也不起作用,因为这种方法在子类中不可见,因此不能被覆盖。

我建议使用 interface 选择性地公开或隐藏方法:

public interface WithMethod {
// other methods
void method();
}

public interface WithoutMethod {
// other methods
// no 'method()'
}

public abstract class A {
protected void method();
}

public class B extends A implements WithMethod {
@Override
public void method(){
//TODO
}
}

public class C extends B implements WithoutMethod {
// no 'method()'
}

...那么只能通过接口(interface)处理实例。

关于java - 覆盖方法可以具有与基类中不同的访问说明符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35956217/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com