为什么子类的方法更容易访问?

一个简单的例子


class A {

    protected int foo(int x){

        return x;   

    }

}


class B extends A {

    public int foo(int x){

        return x*x; 

    }

}

这在 Java 中是允许的,并且没有任何问题。但是让我们说在另一个包中你声明


A b = new B();

int z = b.foo(5);

那么这将不起作用,因为显然 A foo() 是受保护的。但是,为什么首先要允许在子类中有更多可访问的方法呢?是否有这种情况有帮助?


Smart猫小萌
浏览 132回答 3
3回答

RISEBY

一般来说,子类可以向它们从父类继承的接口添加方法。使方法更易于访问是有效地添加到接口中。但是,为什么首先要允许在子类中有更多可访问的方法呢?因为它对于包含子类引用的代码很有用。是否有这种情况有帮助?一个很好的例子是Object.clone(),一种受保护的方法。所有 Java 类都是Object. 支持克隆的子类可以选择公开这个方法。Foo foo1 = new Foo();Foo foo2 = foo1.clone(); // Sometimes you're holding a subclass reference.

慕的地6264312

因为分类应该允许您将子类视为其超类的实例。我认为这称为is-a关系(即B is-a A,但不是相反)。我真的不知道简洁地解释这一点的好方法。在您的示例中,所有实例B也是 实例A(请注意,这可能过于简单化,但我认为对于此示例就足够了)。A仅保证在其自己的定义中具有公开的方法。B只是碰巧创建了一个受保护的方法public,但假设您有另一个C未执行此操作的类调用。好吧,您可以同时将B和C转换为A,但是如果您被允许调用受保护的方法 onA因为B将其公开,那么您在传递C.在另一个包中,您将强制转换B为A,因此您的对象有效地采用了 的接口,A因此您只能使用由 提供给您的接口A。在JVM可以顺利通过的麻烦和通知:1)A其实B和2)B使foo公众,所以foo应该是可调用的?我的意思是我可以假设,但是在 JVM 中实现需要多少努力以及它有多容易出错?把事情简单化。如果类型为A,则接口为A。如果类型为B,则接口为A以及B除此之外的任何其他内容。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java